扩展包不兼容,适配器来处理?

最近在使用 lazychaser/laravel-nestedset 扩展包实现无限级分类,同时又引入了 GeneaLabs\LaravelModelCaching 进行模型缓存,两者都是在模型中引入相应的 trait

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use GeneaLabs\LaravelModelCaching\Traits\Cachable;
use Kalnoy\Nestedset\NodeTrait;

class Category extends Model
{
    use Cachable, NodeTrait {
        Cachable::newEloquentBuilder insteadof NodeTrait;
    }
...

由于两个 trait 中有共同的方法 newEloquentBuilder,所以后边进行了冲突的解决。但是又因为两个 trait 中该方法都是在 Illuminate\Database\Eloquent\Builder 的基础之上进行了各自的扩展,所以上述 instedof 方式的冲突处理会丢失扩展包中的一些方法。各扩展包实现方式:

  • Kalnoy\Nestedset\NodeTrait 的 newEloquentBuilder 的实现

public function newEloquentBuilder($query)
{        
    return new QueryBuilder($query);
}
...
// QueryBuilder 扩展了 Illuminate\Database\Eloquent\Builder;
namespace Kalnoy\Nestedset;
use Illuminate\Database\Eloquent\Builder;
class QueryBuilder extends Builder
{   
...
  • GeneaLabs\LaravelModelCaching 的 newEloquentBuilder 方法的实现
public function newEloquentBuilder($query)
{
    if (! $this->isCachable()) {
        $this->isCachable = false;
        return new EloquentBuilder($query);
    }
    return new CachedBuilder($query);
}
···
// 其实CachedBuilder也是继承并扩展了 Illuminate\Database\Eloquent\Builder;
<?php
namespace GeneaLabs\LaravelModelCaching;
use GeneaLabs\LaravelModelCaching\Traits\BuilderCaching;
use GeneaLabs\LaravelModelCaching\Traits\Buildable;
use GeneaLabs\LaravelModelCaching\Traits\Caching;
use Illuminate\Database\Eloquent\Builder as EloquentBuilder;

class CachedBuilder extends EloquentBuilder
{
    use Buildable;
    use BuilderCaching;
    use Caching;
}

总结如下: 也就是说两个包都有 newEloquentBuilder方法,返回各自扩展后的Illuminate\Database\Eloquent\Builder 对象,看上去像是需要进行适配,请问这种情况是否该应用适配器模式,该如何进行适配?

扩展包不兼容,适配器来处理?

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 1

共同的方法,use的时候其中一个重命名

3年前 评论
seeker-x2y (楼主) 3年前
deatil (作者) 3年前
seeker-x2y (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!