fuguevit/repositories

Laravel5 的仓储模式实现

1.2.3 2017-02-03 10:06 UTC

This package is not auto-updated.

Last update: 2022-09-17 08:46:34 UTC


README

为 laravel5 eloquent 模型实现仓储模式。

如果您是中文用户,您可以查看此文档。 点击此处

安装

从您的终端运行以下命令

composer require "fuguevit/repositories: ^1.0.0"

或者将此添加到 composer.json 文件的 require 部分

"fuguevit/repositories": "^1.0.0"

然后运行 composer update

概述

首先,在 config/app.php 文件中添加 repository 服务提供者。

Fuguevit\Repositories\Providers\RepositoryServiceProvider::class

然后,将仓储配置文件复制到 config 文件夹。

php artisan vendor:publish --provider="Fuguevit\Repositories\Providers\RepositoryServiceProvider" --tag=config

您需要将 repository.php 文件中的参数替换为您的本地配置,尤其是当您有特定的命名空间时。

  'repository_namespace' => 'App\Repositories',
  'repository_path' 	 => 'app'.DIRECTORY_SEPARATOR.'Repositories',
  'criteria_namespace'   => 'App\Repositories\Criteria',
  'criteria_path'        => 'app'.DIRECTORY_SEPARATOR.'Repositories'.DIRECTORY_SEPARATOR.'Criteria',
  'model_namespace' 	 => 'App',
  'cache_enabled'   	 => env('REPOSITORY_CACHE', true),
  'cache_ttl'       	 => env('REPOSITORY_CACHE_TTL', 30),
  'cache_use_tags'       => env('REPOSITORY_CACHE_TAGS', false),

假设您有一个名为 Question 的模型,您可以简单地使用以下命令创建仓储

php artisan make:repository QuestionsRepository

仓储生成如下

<?php

namespace App\Repositories;

use Fuguevit\Repositories\Eloquent\Repository;

/**
 * Class QuestionsRepository
 * @package App\Repositories
 */
class QuestionsRepository extends Repository
{
    /**
     * @return string
     */
    public function model()
    {
        return 'App\Question';
    }
}

用法

默认情况下,您可以通过属性查找问题。例如

// find question by id
$question = Question::find($id);

// find questions by attribute 'category' while equals 'others'
$questions = Question::where('category', 'others')->get();

当使用仓储时,您可以简单地这样做

// init QuestionsRepository object called $question

// find question by id
$result = $question->find($id);

// find questions by attribute 'category' while equals 'others'
$results = $question->findBy('category', 'others');

所有 CRUD 函数都打包得很好,在下一节中我们将看到函数列表。

方法

以下方法可用

Fuguevit\Repositories\Contracts\RepositoryInterface

    public function all($columns = ['*']);
    public function lists($value, $key = null);
    public function create(array $attributes);
    public function save(array $attributes);
    public function update(array $attributes, $id);
    public function delete($id);
    public function find($id, $columns = ['*']);
    public function findBy($field, $value, $columns = ['*']);
    public function findAllBy($field, $value, $columns = ['*']);
    public function findAllExcept($field, $value, $columns = ['*']);
    public function findIn($field, array $values, $columns = ['*']);
    public function findNotIn($field, array $values, $columns = ['*']);
    public function findWhere($where, $columns = ['*']);
    public function paginate($perPage = 1, $columns = ['*']);
    public function orderBy($field, $direction = 'asc');
    public function with(array $relations);

Fuguevit\Repositories\Contracts\CriteriaInterface

    public function apply($model, Repository $repository);

示例

  • 获取所有实体
    $this->question->all();
  • 创建一个新的实体
    $this->question->create($fillable);
  • 更新一个实体
    $this->question->update($attributes, $id);
  • 删除一个实体
    $this->question->delete($id);
  • 按默认 id 查找实体
    $this->question->find($id);
  • 按字段查找实体
    $this->question->findBy($field, $value);
  • 按字段查找所有实体
    $this->question->findAllBy($field, $value;
  • 按范围查找所有实体
    $this->question->findIn($field, $values);
  • 按复杂的多字段查找所有实体
    $this->question->findWhere([
        'user_id' => $userId,
        ['created_at', '>', \Carbon\Carbon::yesterday()],
        ['status', 'in', array('active', 'banned')]
    ]);

条件

条件是一种简单的方式,可以将特定的条件或条件集应用于仓储查询。您的条件类必须扩展抽象类 Fuguevit\Repositories\Criteria\Criteria

以下是一个示例

<?php 

namespace App\Repositories\Criteria\Questions;

use Fuguevit\Repositories\Criteria\Criteria;
use Fuguevit\Repositories\Contracts\RepositoryInterface as Repository;

class MadeByVipUser extends Criteria {

    /**
     * @param $model
     * @param RepositoryInterface $repository
     * @return mixed
     */
    public function apply($model, Repository $repository)
    {
        $model = $model->whereHas('user', function ($query) {
            $query->where('role', 'vip');
        });
        return $model;
    }
}

缓存

致谢

此包受 bosnadev/repository 的启发。