artesaos/warehouse

此包已弃用且不再维护。未建议替代包。

Artesãos Warehouse V2 - 简单直接的仓库解决方案!

3.0.0 2016-09-16 05:52 UTC

This package is auto-updated.

Last update: 2022-07-12 21:56:22 UTC


README

Total Downloads Latest Stable Version Latest Unstable Version License

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 是一个基础包,它实现了基本功能,但没有定义业务规则。有两个基础类:BaseRepositoryAbstractCrudRepository

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();
}