wimski / laravel-model-repositories
Laravel模型仓库
v4.0.0
2024-03-15 08:35 UTC
Requires
- php: ^8.0
- laravel/framework: ^9.0 || ^10.0 || ^11.0
- nesbot/carbon: ^2.62.1 || ^3.0
Requires (Dev)
- mockery/mockery: ^1.5
- nunomaduro/larastan: ^1.0 || ^2.0
- orchestra/testbench: ^6.23 || ^7.0 || ^8.0
- phpstan/phpstan-mockery: ^1.0
- phpstan/phpstan-phpunit: ^1.0
- phpunit/phpunit: ^9.5
README
Laravel模型仓库
为Laravel Eloquent模型提供通用仓库模式。
变更日志
使用方法
安装包
composer require wimski/laravel-model-repositories
设置服务提供者
此包不使用包发现加载。您应该创建自己的服务提供者,该提供者扩展此包中的提供者,并将其手动添加到配置中。
app/Providers/RepositoryServiceProvider.php
<?php namespace App\Providers; use Wimski\ModelRepositories\Providers\ModelRepositoryServiceProvider; class RepositoryServiceProvider extends ModelRepositoryServiceProvider { protected array $repositories = [ // add your repository bindings here ]; }
config/app.php
<?php return [ 'providers' => [ /* * Application Service Providers... */ App\Providers\RepositoryServiceProvider::class, ], ];
生成仓库
php artisan make:repository App\\Models\\MyModel
这将创建以下文件
MyModelRepositoryInterface.php
MyModelRepository.php
命名空间和文件位置取决于命名空间配置。
或者,您可以使用命令选项完全覆盖合同和仓库FQN。将跳过命名空间匹配和类名后缀。
php artisan make:repository App\\Models\\MyModel --contract=Foo\\Bar --repository=Lorem\\Ipsum
添加仓库绑定
在服务提供者中设置您的新仓库的绑定。
protected array $repositories = [ MyModelRespositoryInterface::class => MyModelRespository::class, ];
示例用法
class SomeService { protected MyModelRespositoryInterface $repository; public function __construct(MyModelRespositoryInterface $repository) { $this->repository = $repository; } public function doSomething($id): void { $myModel = $this->repository->findOrFail($id); } }
发布配置文件
由于此包未注册自己的服务提供者,在发布此包的配置文件时应该引用您自己的服务提供者。
php artisan vendor:publish --provider=App\Providers\RepositoryServiceProvider
命名空间配置
命名空间配置用于确定您的仓库类 - 以及后续文件的位置 - 的命名空间。每个配置由三部分组成
models
contracts
repositories
当为模型生成仓库时,命令将查找具有匹配提供的模型的models
部分的命名空间配置。然后使用该配置的contracts
和repositories
部分作为仓库类的命名空间。
假设
- 命名空间遵循PSR-4文件位置约定。
- 命名空间位于Laravel应用目录中。
默认配置
'namespaces' => [ [ 'models' => 'App\\Models', 'contracts' => 'App\\Contracts\\Repositories', 'repositories' => 'App\\Repositories', ], ],
为App\Models\MyModel
生成仓库时,将创建以下两个类
App\Contracts\Repositories\MyModelRepositoryInterface
App\Repositories\MyModelRepository
多个配置
您可以有多个命名空间配置,例如在使用域时。
'namespaces' => [ [ 'models' => 'App\\DomainA\\Models', 'contracts' => 'App\\DomainA\\Contracts\\Repositories', 'repositories' => 'App\\DomainA\\Repositories', ], [ 'models' => 'App\\DomainB\\Models', 'contracts' => 'App\\DomainB\\Contracts\\Repositories', 'repositories' => 'App\\DomainB\\Repositories', ], ],
具体性
将使用第一个匹配项,所以如果您有重叠的命名空间配置,请确保将更具体的配置放在顶部。
'namespaces' => [ [ 'models' => 'App\\Models\\SpecificModels', ... ], [ 'models' => 'App\\Models', ... ], ],
可用方法
见接口。
存根定制
见Laravel关于存根定制的文档。此包添加以下存根文件
model.repository.interface.stub
model.repository.stub
PHPUnit
composer test
PHPStan
composer analyze
鸣谢
许可
MIT许可(MIT)。有关更多信息,请参阅许可文件。