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

最近在使用 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 对象,看上去像是需要进行适配,请问这种情况是否该应用适配器模式,该如何进行适配?

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

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 1

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

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

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