czim / laravel-repository
Laravel的仓库(受Bosnadev/Repositories启发并感激)
Requires
- php: ^8.1
- illuminate/database: ^9.0 || ^10.0 || ^11.0
- illuminate/support: ^9.0 || ^10.0 || ^11.0
- myclabs/php-enum: ^1.7
Requires (Dev)
- astrotomic/laravel-translatable: ^11.10
- czim/laravel-listify: ^2.0
- nunomaduro/larastan: ^2.2
- orchestra/testbench: ^8.0
- phpstan/phpstan-mockery: ^1.1
- phpstan/phpstan-phpunit: ^1.1
- phpunit/phpunit: ^9.5
- watson/rememberable: ^6.0
This package is auto-updated.
Last update: 2024-08-30 13:28:23 UTC
README
仓库设置受Bosnadev/Repository包的启发。此包是那个包的扩展、调整(但完全独立)版本,具有自己的接口。
与Bosnadev仓库的一个主要区别是,这个版本能够处理对同一仓库实例的重复和变化的调用,而不会崩溃或不希望的重复应用标准。您可以一次性实例化一个仓库,并以任何顺序对其进行操作,查询和模型操作方法将继续正常工作。
增加的功能包括覆盖或“暂时”设置和删除标准,以及在检索后对模型进行后处理。
我非常清楚使用此类仓库(以及仓库模式)有很多可说的(以及仓库模式),但我发现它们有其用途。我更喜欢在大型项目中使用它们来简化单元测试。
注意:我建议不要使用此包。我在为我的个人遗留项目进行一些更新,但我认为这种方法是一个严重的反模式(至少与Eloquent一起使用时如此)。
版本兼容性
警告
版本4.0有很多破坏性变更。有关详细信息,请参阅变更日志。
安装
通过Composer
$ composer require czim/laravel-repository
如果您想通过make:repository
Artisan命令使用仓库生成器,请将RepositoryServiceProvider
添加到您的config/app.php
。
Czim\Repository\RepositoryServiceProvider::class,
发布仓库配置文件。
php artisan vendor:publish --tag="repository"
基本用法
只需扩展您选择的(抽象)仓库类,例如Czim\Repository\BaseRepository
、Czim\Repository\ExtendedRepository
或Czim\Repository\ExtendedPostProcessingRepository
。
必须提供的唯一抽象方法是model
方法(这就像Bosnadev的仓库的使用方式)。
基础和扩展仓库
根据您的需求,可以扩展三个不同的抽象仓库类
-
BaseRepository
只有检索和简单操作方法(
create()
、update()
和delete()
),以及标准处理。 -
ExtendedRepository
处理模型的
active
检查,默认情况下将排除任何未将active
属性设置为true的模型(可以通过设置hasActive
和/或activeColumn
进行配置)。处理缓存,默认使用dwightwatson/rememberable(但您可以使用自己的缓存标准,如果需要的话)。允许您设置模型作用域,以便您可以使用Eloquent模型作用域来构建查询。
使用仓库检索模型
除了基本内容(受Bosnadev启发)之外,还有一些增加的检索方法
query()
:返回反映活动标准的Eloquent.Builder对象,以增加灵活性count()
first()
findOrFail()
:与find()
类似,但没有找到任何内容时将抛出异常firstOrFail()
:与first()
类似,但没有找到任何内容时将抛出异常
每个检索方法都考虑了当前活动的标准(包括一次性覆盖),见下文。
对于ExtendedPostProcessingRepository
,后处理器会影响返回的所有模型,因此它们在所有检索方法(如find()
、firstOrFail()
、all()
、allCallback
等)中都会被应用。query()
方法返回一个Builder对象,因此绕过了后处理。如果您想手动使用后处理器,只需在任意模型或模型集合上调用postProcess()
即可。
处理标准
与Bosnadev的仓库类似,标准可以推送到仓库以构建查询。您还可以通过覆盖defaultCriteria()
方法并返回一个标准实例的集合来为仓库设置默认标准。
可以通过以下方式通过键定义或推送到仓库标准
$repository->pushCriteria(new SomeCriteria(), 'KeyForCriteria');
这允许您稍后通过引用其键来删除标准
// you can remove Criteria by key $repository->removeCriteria('KeyForCriteria');
要更改仅用于一次调用的标准,有一些辅助方法将保留您当前活动的标准。如果您使用以下任何一种方法,则应用活动标准(如果尚未删除或覆盖),并且仅针对下一个检索方法应用额外的标准。
// you can push one-time Criteria $repository->pushCriteriaOnce(new SomeOtherCriteria()); // you can override active criteria once by using its key $repository->pushCriteriaOnce(new SomeOtherCriteria(), 'KeyForCriteria'); // you can remove Criteria *only* for the next retrieval, by key $repository->removeCriteriaOnce('KeyForCriteria');
请注意,这意味着只能通过这种方式删除或覆盖具有键的标准。提供了一个CriteriaKey
枚举,以便更容易地引用在ExtendedRepository
中使用的标准键,例如'active'、'cache'和'scope'。
配置
开始使用仓库无需配置。您可以通过扩展您选择的抽象仓库类来使用它。
扩展类
一些属性和方法可以扩展以调整工作方式。目前尚无有关此方面的文档(我将稍后添加),但仓库类包含许多注释以帮助您找到自己的路(主要检查ExtendedRepository
类)。
特性
此外,还有一些特性可以用于扩展仓库的功能,请参阅Czim\Repository\Traits
FindsModelsByTranslationTrait
(仅与dimsav/laravel-translatable包一起使用)HandlesEloquentRelationManipulationTrait
HandlesEloquentSavingTrait
HandlesListifyModelsTrait
(仅与lookitsatravis/listify包一起使用)
我主要添加这些特性,因为它们可能有助于将仓库模式作为使单元测试成为可能的一种手段,而无需对Eloquent模型进行模拟。
贡献
有关详细信息,请参阅CONTRIBUTING
致谢
许可
MIT许可(MIT)。有关更多信息,请参阅许可文件