guardian360/repository

使用仓库模式来抽象数据库层。

1.4.0 2022-05-13 11:32 UTC

This package is auto-updated.

Last update: 2024-09-13 16:20:08 UTC


README

Build Status Coverage Status

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

鸣谢

本软件包受到以下优秀软件包的启发

谢谢大家,没有你们我无法完成这项工作。 :)