lerouse / laravel-repository
Laravel 的仓储实现。
Requires
- php: ^8.0|^8.1
- ext-json: *
- illuminate/contracts: ^6.0|^7.0|^8.0|^9.0|^10.0
- illuminate/database: ^6.0|^7.0|^8.0|^9.0|^10.0
- illuminate/events: ^6.0|^7.0|^8.0|^9.0|^10.0
- illuminate/support: ^6.0|^7.0|^8.0|^9.0|^10.0
- laravel/legacy-factories: ^1.2
Requires (Dev)
- mockery/mockery: ~1.0
- orchestra/testbench: ^4.0||^5.0||^6.0||^7.0||^8.0
- phpunit/phpunit: ^7.3||^8.2||^9.3||^10.0
README
Laravel 框架 v6.0 及以上版本的模型仓储实现。
此包提供了一种结构化的框架,用于在现有的 Laravel 应用程序中开始实现简单的模型仓储结构。
安装
推荐使用 composer 安装 LaravelRepository。
php composer require lerouse/laravel-repository
无自动发现功能的 Laravel
如果您不使用自动发现,请将 ServiceProvider 添加到 config/app.php 文件中的 providers 数组。
\Lerouse\LaravelRepository\LaravelRepositoryServiceProvider::class,
包配置
将包配置复制到您的本地配置目录。
php artisan vendor:publish --tag=repository-config
用法
模型仓储位置
默认情况下,Laravel 模型仓储假定模型仓储存储在目录 app/repositories/model
中。如果您想更改模型仓储存储的目录,请更改 config/repository.php
配置文件中的命名空间变量。
'namespace' => '\App\Repositories\Model',
例如,如果您的模型仓储位于 app/model/repositories
,请将命名空间更新为:
'namespace' => '\App\Model\Repositories',
创建仓储
仓储应扩展 Lerouse\LaravelRepository\EloquentRepository
类,并实现 builder 方法,该方法应返回一个 Illuminate\Database\Eloquent\Builder
实例。
<?php namespace App\Repositories\Models; use Illuminate\Database\Eloquent\Builder; use Lerouse\LaravelRepository\EloquentRepository; use App\Models\User; class UserRepository extends EloquentRepository { /** * Get the Repository Query Builder * * @return Builder */ public function builder(): Builder { return User::query(); } }
以下方法可供使用:
使用仓储
可以直接使用仓储(如上所述,有可用的内置方法)。
<?php namespace App\Http\Controllers; use Illuminate\Database\Eloquent\Builder; class UserController { /** * Get the Repository Query Builder * * @return Builder */ public function index(): Builder { $repository = new UserRepository; return $repository->all(); } }
扩展仓储
仓储应该是扩展/修改模型查询的唯一点。这种方法的优点是所有的模型业务逻辑都在单个位置。以下是一个包含常用扩展功能以及一些也使用的自定义方法的仓储示例。
<?php namespace App\Repositories\Models; use Illuminate\Contracts\Pagination\LengthAwarePaginator; use Illuminate\Database\Eloquent\Builder; use Lerouse\LaravelRepository\EloquentRepository; use Illuminate\Database\Eloquent\Collection; use App\Models\Team; use App\Models\User; class UserRepository extends EloquentRepository { /** * Get all models as Paginated Results * * @param int|null $limit * @param int $page * @return LengthAwarePaginator */ public function paginate(int $limit = null, int $page = 1): LengthAwarePaginator { return $this->builder() ->orderBy($this->getModelTable() . '.created_at', 'desc') ->paginate($limit ?? 25, $page); } /** * Get active Users * * @return Collection */ public function active(): Collection { return $this->builder() ->where($this->getModelTable() . 'active', '=', true) ->orderBy($this->getModelTable() . '.created_at', 'desc') ->get(); } /** * Get the Repository Query Builder * * @return Builder */ public function builder(): Builder { return User::query() ->select($this->getModelTable() . '.*') ->selectRaw('teams.name as user_team_name') ->leftJoin('teams', 'teams.id', '=', $this->getModelTable() . '.team_id'); } }
Laravel 路由模型绑定
Laravel 路由模型绑定提供了一种方便的方式,可以自动将模型实例直接注入到路由中。要强制路由模型绑定使用您的仓储而不是模型本身,您可以将 Lerouse\LaravelRepository\HasRepository
特性添加到您的模型中。
<?php namespace App\Http\Controllers; use Illuminate\Database\Eloquent\Model; use Lerouse\LaravelRepository\HasRepository; class User extends Model { use HasRepository; }
现在当您使用 Laravel 的路由模型绑定时,仓储的 find 方法将被使用。
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Database\Eloquent\Builder; class UserController extends Controller { /** * Get the Repository Query Builder * * @return Builder */ public function show(User $user): Builder // binding resolved through the UserRepository's find method { return $user; } }
请注意:仓储的位置是通过 config/repository.php
配置文件中的命名空间变量确定的。
'namespace' => '\App\Repositories\Model',
许可证
Laravel 模型仓储是免费软件,根据 MIT 许可证的条款分发。