bradleykingdev / laravel-repository
Laravel 的仓库
Requires
- php: ^7.2|^8.0
- illuminate/database: ^6.0|^7.0|^8.0
- illuminate/support: ^6.0|^7.0|^8.0
- myclabs/php-enum: ^1.7
Requires (Dev)
- astrotomic/laravel-translatable: ^11.8
- czim/laravel-listify: ^1.1|^2.0
- orchestra/testbench: ^6.7.0
- phpunit/phpunit: ^8.0|^9.0
- watson/rememberable: ^5.0.1
This package is auto-updated.
Last update: 2024-09-26 23:46:03 UTC
README
安装
通过 Composer
composer require BradleyKingDev/laravel-repository
如果你想通过 make:repository Artisan 命令使用仓库生成器,请将 RepositoryServiceProvider 添加到你的 config/app.php
BradleyKingDev\Repository\RepositoryServiceProvider::class,
发布仓库配置文件。
php artisan vendor:publish --tag="repository"
基本用法
简单地扩展你选择的(抽象)仓库类,可以是 BradleyKingDev\Repository\BaseRepository、BradleyKingDev\Repository\ExtendedRepository 或 BradleyKingDev\Repository\ExtendedPostProcessingRepository。
必须提供的唯一抽象方法是 model 方法(这与 Bosnadev 的仓库使用方式类似)。
制作仓库
make:repository 命令自动创建一个新的 Eloquent 模型仓库类。它还会尝试链接正确的 Eloquent 模型,但请确保它已正确设置。
php artisan make:repository PostsRepository
上面的命令将创建一个名为 PostsRepository 的仓库类,并将 Post 模型链接到它。
如果你想显式设置相关模型,可以添加模型类名
php artisan make:repository PostsRepository "App\Models\AlternativePost"
基本、扩展和后处理
根据你的需求,可以扩展三个不同的抽象仓库类
-
BaseRepository仅包含检索和简单操作方法(
create()、update()和delete()),以及条件处理。 -
ExtendedRepository处理模型的 激活 检查,默认情况下将排除任何
active属性未设置为 true 的模型(可以通过设置hasActive和/或activeColumn来配置)。处理缓存,默认使用 dwightwatson/rememberable(但如果你希望,可以使用自己的缓存条件)。允许你设置模型作用域,当你想使用 Eloquent 模型作用域来构建查询时。 -
ExtendedPostProcessingRepository与 Extended 类似,但在检索模型之后允许修改/装饰模型。默认情况下,唯一活动的后处理器允许你在模型上隐藏/显示属性。
使用仓库检索模型
除了基本功能(受 Bosnadev 启发),还有一些额外的检索方法
query():返回一个反映当前条件的 Eloquent.Builder 对象,以提供额外的灵活性count()first()findOrFail():与find()类似,但如果没有找到任何内容则抛出异常firstOrFail():与first()类似,但如果没有找到任何内容则抛出异常
每个检索方法都会考虑当前活动的条件(包括一次性覆盖),见下文。
对于 ExtendedPostProcessingRepository,后处理器会影响返回的所有模型,并在所有检索方法(find()、firstOrFail()、all()、allCallback 等)中应用。`query()` 方法返回一个 Builder 对象,因此绕过了后处理。如果你想手动使用后处理器,只需在任意模型或模型集合上调用 postProcess() 即可。
处理条件
与 Bosnadev 的仓库类似,条件可以推送到仓库以构建查询。也可以通过覆盖 defaultCriteria() 方法并返回一个条件实例的 Collection 来为仓库设置默认条件。
条件可以通过 键 定义或推送到仓库,如下所示
$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 类)。
特性
此外,还有一些特性可以用来扩展存储库的功能,请参阅 BradleyKingDev\Repository\Traits
FindsModelsByTranslationTrait(仅在结合使用 dimsav/laravel-translatable 包时有用)HandlesEloquentRelationManipulationTraitHandlesEloquentSavingTraitHandlesListifyModelsTrait(仅在结合使用 lookitsatravis/listify 包时有用)
我添加这些特性的主要原因是它们可能有助于使用存储库模式作为实现单元测试的手段,而无需模拟 Eloquent 模型。
贡献
有关详细信息,请参阅 CONTRIBUTING