扩展包不兼容,适配器来处理?
最近在使用 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
对象,看上去像是需要进行适配,请问这种情况是否该应用适配器模式,该如何进行适配?
共同的方法,use的时候其中一个重命名