phumsoft/repository

该软件包用于自定义默认仓库软件包

v1.2.0 2024-06-02 16:39 UTC

README

CI Latest Stable Version Total Downloads License

仓库模式 是封装访问数据源所需逻辑的类或组件。它们集中了常见的数据访问功能,提供了更好的可维护性,并将访问数据库的基础设施或技术从领域模型层解耦。

因此,这里有一个自定义软件包,用于自定义代码结构,以减少对仓库应用程序的常见逻辑的重写。

目录

安装

需求

  • Laravel 9.x 或更高版本
  • PHP 8.1

Composer

执行以下命令以获取软件包的最新版本

composer require phumsoft/repository

方法

Prettus\Repository\Contracts\RepositoryInterface

  • all($columns = array('*'))
  • first($columns = array('*'))
  • paginate($limit = null, $columns = ['*'])
  • find($id, $columns = ['*'])
  • findByField($field, $value, $columns = ['*'])
  • findWhere(array $where, $columns = ['*'])
  • findWhereIn($field, array $where, $columns = [*])
  • findWhereNotIn($field, array $where, $columns = [*])
  • findWhereBetween($field, array $where, $columns = [*])
  • create(array $attributes)
  • update(array $attributes, $id)
  • updateOrCreate(array $attributes, array $values = [])
  • delete($id)
  • deleteWhere(array $where)
  • orderBy($column, $direction = 'asc');
  • with(array $relations);
  • has(string $relation);
  • whereHas(string $relation, closure $closure);
  • hidden(array $fields);
  • visible(array $fields);
  • scopeQuery(Closure $scope);
  • getFieldsSearchable();
  • setPresenter($presenter);
  • skipPresenter($status = true);

Prettus\Repository\Contracts\RepositoryCriteriaInterface

  • pushCriteria($criteria)
  • popCriteria($criteria)
  • getCriteria()
  • getByCriteria(CriteriaInterface $criteria)
  • skipCriteria($status = true)
  • getFieldsSearchable()

Prettus\Repository\Contracts\CacheableInterface

  • setCacheRepository(CacheRepository $repository)
  • getCacheRepository()
  • getCacheKey($method, $args = null)
  • getCacheTime()
  • skipCache($status = true)

Prettus\Repository\Contracts\PresenterInterface

  • present($data);

Prettus\Repository\Contracts\Presentable

  • setPresenter(PresenterInterface $presenter);
  • presenter();

Prettus\Repository\Contracts\CriteriaInterface

  • apply($model, RepositoryInterface $repository);

Prettus\Repository\Contracts\Transformable

  • transform();

3. 使用

创建一个模型

创建您的模型,但重要的是要定义可以由输入表单数据填充的属性。

namespace App;

class Post extends Eloquent { // or Ardent, Or any other Model Class

    protected $fillable = [
        'title',
        'author',
        ...
     ];

     ...
}

创建一个仓库

namespace App;

use Phumpie\Repository\Eloquent\Repository;

class PostRepository extends Repository {

    /**
     * Specify Model class name
     *
     * @return string
     */
    function model()
    {
        return "App\\Post";
    }
}

生成器

通过生成器轻松创建您的仓库。

配置

您必须首先配置仓库文件的存储位置。默认情况下是“app”文件夹和“App”命名空间。请注意,paths数组中的值实际上用作命名空间和文件路径。不过,生成过程中会处理正斜杠和反斜杠。

    ...
    'generator'=>[
        'basePath'=>app()->path(),
        'rootNamespace'=>'App\\',
        'paths'=>[
            'models' => 'Models',
            'repositories' => 'Repositories/Eloquents',
            'interfaces' => 'Repositories/Interfaces',
            'transformers' => 'Repositories/Transformers',
            'presenters' => 'Repositories/Presenters',
            'validators' => 'Validators',
            'controllers' => 'Http/Controllers',
            'provider' => 'RepositoryServiceProvider',
            'criteria' => 'Repositories/Criteria',
        ]
    ]

您可能希望将项目文件夹的根目录保存到“app”之外,并添加另一个命名空间,例如

    ...
     'generator'=>[
        'basePath'      => base_path('src/Lorem'),
        'rootNamespace' => 'Lorem\\'
    ]

此外,您还可以自定义生成的类保存的位置。可以通过编辑paths节点来实现这一点。例如

    'generator'=>[
        'basePath'=>app()->path(),
        'rootNamespace'=>'App\\',
        'paths'=>[
            'models'=>'Models',
            'repositories'=>'Repositories\\Eloquent',
            'interfaces'=>'Contracts\\Repositories',
            'transformers'=>'Transformers',
            'presenters'=>'Presenters'
            'validators'   => 'Validators',
            'controllers'  => 'Http/Controllers',
            'provider'     => 'RepositoryServiceProvider',
            'criteria'     => 'Criteria',
        ]
    ]

命令

要生成您的模型所需的所有内容,请运行以下命令

php artisan make:entity Post

这将创建控制器、验证器、模型、仓库、展示器和转换类。它还将创建一个新的服务提供者,用于将Eloquent仓库与其对应的仓库接口绑定。要加载它,只需将其添加到您的AppServiceProvider@register方法中

    $this->app->register(RepositoryServiceProvider::class);

由于这个命令只是一个包装器,您也可以传递来自repository命令的选项。

要为您的Post模型生成仓库,请使用以下命令

php artisan make:repository Post

要为具有Blog命名空间的Post模型生成仓库,请使用以下命令

php artisan make:repository "Blog\Post"

添加可填充的字段

php artisan make:repository "Blog\Post" --fillable="title,content"

要直接使用命令添加验证规则,需要传递--rules选项并创建迁移

php artisan make:entity Cat --fillable="title:string,content:text" --rules="title=>required|min:2, content=>sometimes|min:10"

该命令还会创建您的基本RESTfull控制器,因此只需将此行添加到您的routes.php文件中,您就可以拥有基本的CRUD操作

Route::resource('cats', CatsController::class);

在运行命令时,您将在您设置的默认文件夹中创建“Entities”文件夹和“Repositories”文件夹。

现在已完成,您仍需要将其接口与实际仓库绑定,例如在您自己的Repositories Service Provider中。

App::bind('{YOUR_NAMESPACE}Repositories\PostRepository', '{YOUR_NAMESPACE}Repositories\PostRepositoryEloquent');

并使用

public function __construct({YOUR_NAMESPACE}Repositories\PostRepository $repository){
    $this->repository = $repository;
}

或者,您可以使用Artisan命令来为您完成绑定。

php artisan make:bindings Cats

使用方法

namespace App\Http\Controllers;

use App\PostRepository;

class PostsController extends BaseController {

    /**
     * @var PostRepository
     */
    protected $repository;

    public function __construct(PostRepository $repository){
        $this->repository = $repository;
    }

    ....
}

在仓库中查找所有结果

$posts = $this->repository->all();

使用分页在仓库中查找所有结果

$posts = $this->repository->paginate($limit = null, $columns = ['*']);

按id查找结果

$post = $this->repository->find($id);

隐藏模型的属性

$post = $this->repository->hidden(['country_id'])->find($id);

仅显示模型的具体属性

$post = $this->repository->visible(['id', 'state_id'])->find($id);

加载模型关系

$post = $this->repository->with(['state'])->find($id);

按字段名查找结果

$posts = $this->repository->findByField('country_id','15');

按多个字段查找结果

$posts = $this->repository->findWhere([
    //Default Condition =
    'state_id'=>'10',
    'country_id'=>'15',

    //Custom Condition
    ['columnName1','>','10'],

    //DATE, DAY, MONTH, YEAR
    ['columnName2','DATE','2021-07-02'], //whereDate
    ['columnName3','DATE >=','2021-07-02'], //whereDate with operator

    ['columnName4','IN',['value1','value2']], //whereIn
    ['columnName5','NOTIN',['value1','value2']], //whereNotIn
    ['columnName6','EXIST',''], //whereExists

    //HAS, HASMORPH, DOESNTHAVE, DOESNTHAVEMORPH
    ['columnName7','HAS',function($query){}], //whereHas

    //BETWEEN, BETWEENCOLUMNS, NOTBETWEEN, NOTBETWEENCOLUMNS
    ['columnName8','BETWEEN',[10, 100]], //whereBetween
]);

按一个字段中的多个值查找结果

$posts = $this->repository->findWhereIn('id', [1,2,3,4,5]);

按一个字段中排除多个值查找结果

$posts = $this->repository->findWhereNotIn('id', [6,7,8,9,10]);

使用自定义作用域查找所有结果

$posts = $this->repository->scopeQuery(function($query){
    return $query->orderBy('sort_order','asc');
})->all();

在仓库中创建新条目

$post = $this->repository->create( Input::all() );

在仓库中更新条目

$post = $this->repository->update( Input::all(), $id );

在仓库中删除条目

$this->repository->delete($id)

按多个字段删除仓库中的条目

$this->repository->deleteWhere([
    //Default Condition =
    'state_id'=>'10',
    'country_id'=>'15',
])

创建一个条件

使用命令

php artisan make:criteria MyCriteria

标准是根据您的需要应用特定条件来更改查询的仓库的方法。您可以在您的仓库中添加多个标准。

use Prettus\Repository\Contracts\RepositoryInterface;
use Prettus\Repository\Contracts\CriteriaInterface;

class MyCriteria implements CriteriaInterface {

    public function apply($model, RepositoryInterface $repository)
    {
        $model = $model->where('user_id','=', Auth::user()->id );
        return $model;
    }
}

在控制器中使用条件

namespace App\Http\Controllers;

use App\PostRepository;

class PostsController extends BaseController {

    /**
     * @var PostRepository
     */
    protected $repository;

    public function __construct(PostRepository $repository){
        $this->repository = $repository;
    }


    public function index()
    {
        $this->repository->pushCriteria(new MyCriteria1());
        $this->repository->pushCriteria(MyCriteria2::class);
        $posts = $this->repository->all();
		...
    }

}

从标准获取结果

$posts = $this->repository->getByCriteria(new MyCriteria());

在仓库中设置默认标准

use Phumpie\Repository\Eloquent\Repository;

class PostRepository extends Repository {

    public function boot(){
        $this->pushCriteria(new MyCriteria());
        // or
        $this->pushCriteria(AnotherCriteria::class);
        ...
    }

    function model(){
       return "App\\Post";
    }
}

跳过仓库中定义的标准

在任何其他链式方法之前使用skipCriteria

$posts = $this->repository->skipCriteria()->all();

弹出标准

使用popCriteria来删除标准

$this->repository->popCriteria(new Criteria1());
// or
$this->repository->popCriteria(Criteria1::class);

使用请求条件

RequestCriteria是标准的Criteria实现。它允许从请求中发送的参数执行过滤操作。

您可以执行动态搜索、过滤数据并自定义查询。

要使用Criteria在您的仓库中,您可以在仓库的boot方法中添加一个新的标准,或者直接在控制器中使用,以过滤出少数请求。

在仓库中启用

use Phumpie\Repository\Eloquent\Repository;
use Prettus\Repository\Criteria\RequestCriteria;


class PostRepository extends Repository {

	/**
     * @var array
     */
    protected $fieldSearchable = [
        'name',
        'email'
    ];

    public function boot(){
        $this->pushCriteria(app('Prettus\Repository\Criteria\RequestCriteria'));
        ...
    }

    function model(){
       return "App\\Post";
    }
}

记住,您需要定义模型中哪些字段可以被搜索。

在您的仓库中设置$fieldSearchable,带有要搜索的字段名称或字段的关系。

protected $fieldSearchable = [
	'name',
	'email',
	'product.name'
];

您可以设置用于执行查询的条件类型,默认条件是“=”。

protected $fieldSearchable = [
	'name'=>'like',
	'email', // Default Condition "="
	'your_field'=>'condition'
];

在控制器中启用

	public function index()
    {
        $this->repository->pushCriteria(app('Prettus\Repository\Criteria\RequestCriteria'));
        $posts = $this->repository->all();
		...
    }

示例:指定条件

通过请求请求所有数据,不进行筛选

  • http://phumpie.local/users
[
  {
    "id": 1,
    "name": "John Doe",
    "email": "john@gmail.com",
    "created_at": "-0001-11-30 00:00:00",
    "updated_at": "-0001-11-30 00:00:00"
  },
  {
    "id": 2,
    "name": "Lorem Ipsum",
    "email": "lorem@ipsum.com",
    "created_at": "-0001-11-30 00:00:00",
    "updated_at": "-0001-11-30 00:00:00"
  },
  {
    "id": 3,
    "name": "Laravel",
    "email": "laravel@gmail.com",
    "created_at": "-0001-11-30 00:00:00",
    "updated_at": "-0001-11-30 00:00:00"
  }
]

在仓库中执行研究

  • http://phumpie.local/users?search=John%20Doe

  • http://phumpie.local/users?search=John&searchFields=name:like

  • http://phumpie.local/users?search=john@gmail.com&searchFields=email:=

  • http://phumpie.local/users?search=name:John Doe;email:john@gmail.com

  • http://phumpie.local/users?search=name:John;email:john@gmail.com&searchFields=name:like;email:=
[
  {
    "id": 1,
    "name": "John Doe",
    "email": "john@gmail.com",
    "created_at": "-0001-11-30 00:00:00",
    "updated_at": "-0001-11-30 00:00:00"
  }
]

您可以使用“search”参数,而不必使用完整的“searchFields”参数。

  • http://phumpie.local/users?search=id:2;age:17;email:john@gmail.com&searchFields='id':=

默认情况下,RequestCriteria 使用每个查询参数的 OR 比较运算符进行查询。

  • http://phumpie.local/users?search=age:17;email:john@gmail.com

上述示例将执行以下查询

SELECT * FROM users WHERE age = 17 OR email = 'john@gmail.com';

要使用 AND 进行查询,请按以下方式传递 searchJoin 参数

  • http://phumpie.local/users?search=age:17;email:john@gmail.com&searchJoin=and

使用 hasdoesntHave 搜索记录

  • http://phumpie.local/users?has=role

  • http://phumpie.local/users?doesntHave=role

筛选字段

http://phumpie.local/users?filter=id;name

[
  {
    "id": 1,
    "name": "John Doe"
  },
  {
    "id": 2,
    "name": "Lorem Ipsum"
  },
  {
    "id": 3,
    "name": "Laravel"
  }
]

排序结果

http://phumpie.local/users?filter=id;name&orderBy=id&sortedBy=desc

[
  {
    "id": 3,
    "name": "Laravel"
  },
  {
    "id": 2,
    "name": "Lorem Ipsum"
  },
  {
    "id": 1,
    "name": "John Doe"
  }
]

通过相关表排序

http://phumpie.local/users?orderBy=posts|title&sortedBy=desc

查询将类似于以下内容

...
INNER JOIN posts ON users.post_id = posts.id
...
ORDER BY title
...

http://phumpie.local/users?orderBy=posts:custom_id|posts.title&sortedBy=desc

查询将类似于以下内容

...
INNER JOIN posts ON users.custom_id = posts.id
...
ORDER BY posts.title
...

http://phumpie.local/users?orderBy=posts:custom_id,other_id|posts.title&sortedBy=desc

查询将类似于以下内容

...
INNER JOIN posts ON users.custom_id = posts.other_id
...
ORDER BY posts.title
...

按相同排序顺序排序多列

http://phumpie.local/users?orderBy=name;created_at&sortedBy=desc

结果将类似于以下内容

[
  {
    "id": 1,
    "name": "Laravel",
    "created_at": "-0001-11-29 00:00:00"
  },
  {
    "id": 3,
    "name": "Laravel",
    "created_at": "-0001-11-28 00:00:00"
  },
  {
    "id": 2,
    "name": "John Doe",
    "created_at": "-0001-11-30 00:00:00"
  }
]

按不同排序顺序排序多列

http://phumpie.local/users?orderBy=name;created_at&sortedBy=desc;asc

结果将类似于以下内容

[
  {
    "id": 3,
    "name": "Laravel",
    "created_at": "-0001-11-28 00:00:00"
  },
  {
    "id": 1,
    "name": "Laravel",
    "created_at": "-0001-11-29 00:00:00"
  },
  {
    "id": 2,
    "name": "John Doe",
    "created_at": "-0001-11-30 00:00:00"
  }
]

添加关系

http://phumpie.local/users?with=groups

范围筛选

http://phumpie.local/product?search=price:100,500&searchFields=price:between

结果将类似于以下内容

[
  {
    "id": 3,
    "price": "150",
    "created_at": "-0001-11-28 00:00:00"
  },
  {
    "id": 1,
    "price": "300",
    "created_at": "-0001-11-29 00:00:00"
  },
  {
    "id": 2,
    "price": "450",
    "created_at": "-0001-11-30 00:00:00"
  }
]

WhereIn筛选

http://phumpie.local/product?search=price:300,500&searchFields=price:in

结果将类似于以下内容

[
  {
    "id": 1,
    "price": "300",
    "created_at": "-0001-11-29 00:00:00"
  }
]

重写参数名称

您可以在配置文件 config/repository.php 中更改参数的名称。

缓存

轻松为您的仓库添加一层缓存

缓存使用

实现 CacheableInterface 接口并使用 CacheableRepository 特性。

use Phumpie\Repository\Eloquent\Repository;
use Prettus\Repository\Contracts\CacheableInterface;
use Prettus\Repository\Traits\CacheableRepository;

class PostRepository extends BaseRepository implements CacheableInterface {

    use CacheableRepository;

    ...
}

完成,这样您的仓库就会被缓存,并且每当创建、修改或删除项目时,仓库缓存都会被清除。

缓存配置

您可以在文件 config/repository.php 中更改缓存设置,也可以直接在您的仓库上直接更改。

config/repository.php

'cache'=>[
    //Enable or disable cache repositories
    'enabled'   => true,

    //Lifetime of cache
    'minutes'   => 30,

    //Repository Cache, implementation Illuminate\Contracts\Cache\Repository
    'repository'=> 'cache',

    //Sets clearing the cache
    'clean'     => [
        //Enable, disable clearing the cache on changes
        'enabled' => true,

        'on' => [
            //Enable, disable clearing the cache when you create an item
            'create'=>true,

            //Enable, disable clearing the cache when upgrading an item
            'update'=>true,

            //Enable, disable clearing the cache when you delete an item
            'delete'=>true,
        ]
    ],
    'params' => [
        //Request parameter that will be used to bypass the cache repository
        'skipCache'=>'skipCache'
    ],
    'allowed'=>[
        //Allow caching only for some methods
        'only'  =>null,

        //Allow caching for all available methods, except
        'except'=>null
    ],
],

您可以直接在仓库中覆盖这些设置。

use Phumpie\Repository\Eloquent\Repository;
use Prettus\Repository\Contracts\CacheableInterface;
use Prettus\Repository\Traits\CacheableRepository;

class PostRepository extends BaseRepository implements CacheableInterface {

    // Setting the lifetime of the cache to a repository specifically
    protected $cacheMinutes = 90;

    protected $cacheOnly = ['all', ...];
    //or
    protected $cacheExcept = ['find', ...];

    use CacheableRepository;

    ...
}

可缓存的函数是:all、paginate、find、findByField、findWhere、getByCriteria

验证器

需要 prettus/laravel-validatorcomposer require prettus/laravel-validator

使用 prettus/laravel-validator 进行简单验证

有关更多详细信息,请点击此处

使用验证器类

创建验证器

在下面的示例中,我们为创建和编辑定义了一些规则

use \Prettus\Validator\LaravelValidator;

class PostValidator extends LaravelValidator {

    protected $rules = [
        'title' => 'required',
        'text'  => 'min:3',
        'author'=> 'required'
    ];

}

要定义特定规则,请按以下步骤操作

use \Prettus\Validator\Contracts\ValidatorInterface;
use \Prettus\Validator\LaravelValidator;

class PostValidator extends LaravelValidator {

    protected $rules = [
        ValidatorInterface::RULE_CREATE => [
            'title' => 'required',
            'text'  => 'min:3',
            'author'=> 'required'
        ],
        ValidatorInterface::RULE_UPDATE => [
            'title' => 'required'
        ]
   ];

}
在仓库中启用验证器
use Phumpie\Repository\Eloquent\Repository;
use Prettus\Repository\Criteria\RequestCriteria;

class PostRepository extends Repository {

    /**
     * Specify Model class name
     *
     * @return mixed
     */
    function model(){
       return "App\\Post";
    }

    /**
     * Specify Validator class name
     *
     * @return mixed
     */
    public function validator()
    {
        return "App\\PostValidator";
    }
}

在仓库中定义规则

或者,您可以直接在规则仓库属性中设置您的规则,而不是使用一个类来定义它的验证规则,这将与验证类具有相同的效果。

use Phumpie\Repository\Eloquent\Repository;
use Prettus\Repository\Criteria\RequestCriteria;
use Prettus\Validator\Contracts\ValidatorInterface;

class PostRepository extends Repository {

    /**
     * Specify Validator Rules
     * @var array
     */
     protected $rules = [
        ValidatorInterface::RULE_CREATE => [
            'title' => 'required',
            'text'  => 'min:3',
            'author'=> 'required'
        ],
        ValidatorInterface::RULE_UPDATE => [
            'title' => 'required'
        ]
   ];

    /**
     * Specify Model class name
     *
     * @return mixed
     */
    function model(){
       return "App\\Post";
    }

}

验证现在已准备就绪。如果失败,将抛出类型为 Prettus\Validator\Exceptions\ValidatorException 的异常。

演示者

演示者充当对象的包装器和渲染器。

Fractal 展示者

需要 Fractalcomposer require league/fractal

实现演示者的有两种方式,第一种是创建一个 TransformerAbstract 并使用演示者类设置,如创建 Transformer 类中所述。

第二种方式是使您的模型实现 Transformable 接口,并使用默认的演示者模型 FractarPresenter,这将产生相同的效果。

转换器类
使用命令创建转换器
php artisan make:transformer Post

这将生成下面的类。

创建转换器类
use League\Fractal\TransformerAbstract;

class PostTransformer extends TransformerAbstract
{
    public function transform(\Post $post)
    {
        return [
            'id'      => (int) $post->id,
            'title'   => $post->title,
            'content' => $post->content
        ];
    }
}
使用命令创建一个展示者
php artisan make:presenter Post

如果之前没有创建,命令将提示您创建一个变换器。

创建展示者
use Prettus\Repository\Presenter\FractalPresenter;

class PostPresenter extends FractalPresenter {

    /**
     * Prepare data to present
     *
     * @return \League\Fractal\TransformerAbstract
     */
    public function getTransformer()
    {
        return new PostTransformer();
    }
}
在仓库中启用
use Phumpie\Repository\Eloquent\Repository;

class PostRepository extends Repository {

    ...

    public function presenter()
    {
        return "App\\Presenter\\PostPresenter";
    }
}

或者在您的控制器中启用它:

$this->repository->setPresenter("App\\Presenter\\PostPresenter");
从模型中使用展示者之后

如果您记录了一个展示者并且有时使用了skipPresenter()方法,或者您不希望展示者自动更改您的结果,您可以在模型上实现Presentable接口,这样您就可以在任何时候展示您的模型。见下文

在您的模型中实现接口Prettus\Repository\Contracts\PresentablePrettus\Repository\Traits\PresentableTrait

namespace App;

use Prettus\Repository\Contracts\Presentable;
use Prettus\Repository\Traits\PresentableTrait;

class Post extends Eloquent implements Presentable {

    use PresentableTrait;

    protected $fillable = [
        'title',
        'author',
        ...
     ];

     ...
}

现在,您可以单独提交您的模型,见示例

$repository = app('App\PostRepository');
$repository->setPresenter("Prettus\\Repository\\Presenter\\ModelFractalPresenter");

//Getting the result transformed by the presenter directly in the search
$post = $repository->find(1);

print_r( $post ); //It produces an output as array

...

//Skip presenter and bringing the original result of the Model
$post = $repository->skipPresenter()->find(1);

print_r( $post ); //It produces an output as a Model object
print_r( $post->presenter() ); //It produces an output as array

您可以在每次访问时跳过展示者,并在需要时直接在模型中使用它,为此在您的仓库中将$skipPresenter属性设置为true

use Phumpie\Repository\Eloquent\Repository;

class PostRepository extends Repository {

    /**
    * @var bool
    */
    protected $skipPresenter = true;

    public function presenter()
    {
        return "App\\Presenter\\PostPresenter";
    }
}
模型类
实现接口
namespace App;

use Prettus\Repository\Contracts\Transformable;

class Post extends Eloquent implements Transformable {
     ...
     /**
      * @return array
      */
     public function transform()
     {
         return [
             'id'      => (int) $this->id,
             'title'   => $this->title,
             'content' => $this->content
         ];
     }
}
在仓库中启用

Prettus\Repository\Presenter\ModelFractalPresenter是实现了Transformable的模型默认展示者

use Phumpie\Repository\Eloquent\Repository;

class PostRepository extends Repository {

    ...

    public function presenter()
    {
        return "Prettus\\Repository\\Presenter\\ModelFractalPresenter";
    }
}

或者在您的控制器中启用它:

$this->repository->setPresenter("Prettus\\Repository\\Presenter\\ModelFractalPresenter");

在仓库中跳过展示者定义

在任何其他链式方法之前使用skipPresenter

$posts = $this->repository->skipPresenter()->all();

$this->repository->skipPresenter();

$posts = $this->repository->all();

7. 许可证

许可协议:MIT license (https://open-source.org.cn/licenses/MIT)