guardian360 / repository
使用仓库模式来抽象数据库层。
1.4.0
2022-05-13 11:32 UTC
Requires
- php: ^7.0|^8.0
- illuminate/console: >=5.5
- illuminate/database: >=5.5
- illuminate/pagination: >=5.5
Requires (Dev)
- phpunit/phpunit: ^6.0|^7.0|^8.0
Suggests
- jenssegers/mongodb: Needed to support Moloquent models
README
Eloquent 模型的基本仓库。
要求
- PHP >=7.0.0
- PHP MongoDB 驱动(可选)
安装
通过 composer 安装。
$ composer require guardian360/repository
使用方法
首先,您应该创建您的仓库类。您可以手动创建或使用 Artisan 命令 $ php artisan make:repository UserRepository
来创建。您的仓库 必须 扩展 \Guardian360\Repository\AbstractRepository
并实现 model()
方法。
<?php namespace App\Repositories; use App\User; use Guardian360\Repository\AbstractRepository as Repository; class UserRepository extends Repository { /** * Specify the model's class name. * * @return string */ public function model() { return User::class; } }
通过实现 model()
方法,您告诉仓库您想要使用哪个模型类。接下来,在我们的例子中,似乎只有一个 User 模型是合理的。我们为什么不创建一个呢?
<?php namespace App; use Illuminate\Database\Eloquent\Model class User extends Model { // }
最后,您可以在控制器或任何其他地方使用仓库。
<?php namespace App\Http\Controllers; use App\Repositories\UserRepository; class UserController extends Controller { /** * @var \App\Repositories\UserRepository */ protected $users; /** * @return void */ public function __construct(UserRepository $users) { $this->users = $users; } /** * Display a listing of the users. * * @return \Illuminate\Http\Response */ public function index() { return response()->json($this->users->all()); } }
示例
获取所有用户的列表。
$this->users->all();
查找一个用户。
$this->users->find(1);
根据属性查找一个用户。
$this->users->findBy('name', 'Joe');
根据属性查找所有用户。
$this->users->findAllBy('role', 'admin'); $this->users->findAllBy('role', ['admin', 'guest']);
创建一个新的用户。
$this->users->create($request->all());
更新现有的用户。
$this->users->update($user, $request->all()); $this->users->update(1, $request->all());
删除现有的用户。
$this->users->delete($user); $this->users->delete(1); $this->users->delete([1, 2]);
规范
规范允许您向仓库查询应用非常具体的条件。您可以使用 Artisan 命令 $ php artisan make:specification UserIsAdmin
生成一个规范类,或者您也可以手动创建。您的规范 必须 满足 \Guardian360\Repository\Contracts\SpecificationContract
接口。
<?php namespace App\Specifications; use Guardian360\Repository\Contracts\SpecificationContract as Specification class UserIsAdmin implements Specification { /** * Apply the specification. * * @param mixed $query * @return mixed */ public function apply($query) { return $query->where('role', 'admin'); } }
然后,您可以将规范推送到控制器中的仓库。您可以使用任意数量的规范。
<?php namespace App\Http\Controllers; use App\Specifications\UserIsAdmin; use App\Repositories\UserRepository; class UserController extends Controller { /** * @var \App\Repositories\UserRepository */ protected $users; /** * @return void */ public function __construct(UserRepository $user) { $this->users = $users; } /** * Display a listing of the admins. * * @return \Illuminate\Http\Response */ public function index() { $admins = $this->users->pushSpec(new UserIsAdmin)->all(); return response()->json($admins); } }
鸣谢
本软件包受到以下优秀软件包的启发
- https://github.com/bosnadev/repository
- https://github.com/andersao/l5-repository
- https://github.com/ollieread/laravel-repositories
谢谢大家,没有你们我无法完成这项工作。 :)