artesaos / warehouse
Artesãos Warehouse V2 - 简单直接的仓库解决方案!
Requires
- php: >=5.4.0
- illuminate/contracts: ~5
- illuminate/database: ~5
- illuminate/pagination: ~5
- illuminate/support: ~5
- league/fractal: ~0.14
Requires (Dev)
This package is auto-updated.
Last update: 2022-07-12 21:56:22 UTC
README
Warehouse V2 是什么?
Warehouse v2 是一个有点特殊的包,因为它可以在不下载的情况下使用。它更像是现成的演示。
关于 Repository 设计模式有很多讨论,基本上它是在您的应用程序和数据库之间增加的一层,在 Laravel 的情况下,Laravel 负责直接对模型和查询进行操作。
什么是 Repository 模式?
基本上是执行数据库命令的层。
这个模型背后有很多哲学。在最纯粹的形式中,仓库的方法不返回复杂的对象或具有某些依赖的对象,而是返回数组或简单的对象(StdClass)。这是因为其目标之一是允许将使用 MySQL 的仓库替换为使用 MongoDB 的仓库。
现实世界中的今天
OK!听起来很美,但并非所有项目都需要这种做法。如果您使用 Laravel,放弃 Eloquent 并非所有人都会考虑。在 Laravel 中更换数据库也不是那么复杂,多亏了 Eloquent。
由于 Eloquent 和 Collections 带来的便捷性和实用性,此包返回的不是平面对象,而是 Eloquent 和 Collections 对象。
许多人不知道,其他人忘记了,仓库的另一个目标是有序和集中查询,甚至业务规则。这正是 Warehouse V2 试图解决的问题。
安装
执行 composer require artesaos/warehouse 2.x-dev
在 config/app.php
文件中添加服务提供者 Artesaos\Warehouse\WarehouseServiceProvider
'providers' => [ // ... Artesaos\Warehouse\WarehouseServiceProvider::class, // ... ],
此过程不是必需的。您只需要在您使用 Fractal 时这样做。
如何使用
Warehouse v2 是一个基础包,它实现了基本功能,但没有定义业务规则。有两个基础类:BaseRepository
和 AbstractCrudRepository
BaseRepository
此类实现了 BaseRepository
合同,它有三个签名
/** * Returns all records. * If $take is false then brings all records * If $paginate is true returns Paginator instance. * * @param int $take * @param bool $paginate * * @return EloquentCollection|Paginator */ public function getAll($take = 15, $paginate = true);
/** * Retrieves a record by his id * If $fail is true fires ModelNotFoundException. When no record is found. * * @param int $id * @param bool $fail * * @return Model */ public function findByID($id, $fail = true);
/** * @param string $column * @param string|null $key * * @return \Illuminate\Support\Collection|array */ public function lists($column, $key = null);
在实现中,BaseRepository
提供了两个受保护的方法 newQuery()
和 doQuery($query = null, $take = 15, $paginate = true)
。它们在仓库中广泛使用。
newQuery
newQuery 返回一个 eloquent 的 QueryBuilder 对象,该对象从 modelClass
属性获取。
protected function newQuery() { return app()->make($this->modelClass)->newQuery(); }
这个属性需要在所有仓库类中定义
doQuery
doQuery 处理查询并返回一个集合或一个分页对象,具体取决于传入的参数
protected function doQuery($query = null, $take = 15, $paginate = true) { if (is_null($query)) { $query = $this->newQuery(); } if (true == $paginate): return $query->paginate($take); endif; if ($take > 0 || false != $take) { $query->take($take); } return $query->get(); }