fuguevit / repositories
Laravel5 的仓储模式实现
1.2.3
2017-02-03 10:06 UTC
Requires
- php: >=5.6.4
- illuminate/cache: ~5.2
- illuminate/config: ~5.2
- illuminate/console: ~5.2
- illuminate/database: ~5.2
- illuminate/filesystem: ~5.2
- illuminate/support: ~5.2
Requires (Dev)
- orchestra/database: 3.3.x-dev
- orchestra/testbench: 3.3.x-dev
- phpunit/phpunit: 5.*
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 的启发。