mhndev/yii2-repository
Composer 安装命令:
composer require mhndev/yii2-repository
包简介
repository implementation in Yii2
README 文档
README
Yii2 Repository Pattern implementation in Yii2
you can read more about repository patterns here : http://deviq.com/repository-pattern/ http://martinfowler.com/eaaCatalog/repository.html http://shawnmc.cool/the-repository-pattern http://stackoverflow.com/questions/16176990/proper-repository-pattern-design-in-php
Table of Contents
Installation
Composer
The preferred way to install this extension is through composer.
Either run
composer require --prefer-dist mhndev/yii2-repository "1.*"
or add
"mhndev/yii2-repository": "1.*"
to the require section of your composer.json file.
Methods
mhndev\yii2Repository\Interfaces\iRepository
public function with(array $with = []); public function columns(array $columns = ['*']); public function limit($limit = 10); public function orderBy($orderBy, $sort = 'DESC'); public function create(array $data); public function createMany(array $data); public function findOneById($id, $returnArray = false); public function findOneBy($key, $value, $operation = '=', $returnArray = false); public function findManyBy($key, $value, $operation = '=', $withPagination = true, $returnArray = false); public function findManyByIds(array $ids, $withPagination = true, $returnArray = false); public function findAll($withPagination = true, $returnArray = false); public function findManyByCriteria(array $criteria = [], $withPagination = true, $with = [], $returnArray = false); public function updateOneById($id, array $data = []); public function updateOneBy($key, $value, array $data = []); public function updateOneByCriteria(array $criteria, array $data = []); public function updateManyBy($key, $value, array $data = [], $operation = '='); public function updateManyByCriteria(array $criteria = [], array $data = []); public function updateManyByIds(array $ids, array $data = []); public function deleteOneById($id); public function allExist(array $ids); public function deleteOneBy($key, $value, $operation = '='); public function deleteOneByCriteria(array $criteria = []); public function deleteManyBy($key, $value, $operation = '='); public function deleteManyByCriteria(array $criteria = []); public function searchByCriteria(); public function deleteManyByIds(array $ids); public function inc($id, $field, $count = 1); public function dec($id, $field, $count = 1);
Usage
Create a Model
create your ActiveRecord Model :
namespace app\models; use yii\db\ActiveRecord; /** * Class City * @package app\models */ class Post extends ActiveRecord { /** * @return string */ public static function tableName() { return 'posts'; } /** * @return array */ public function rules() { return [ [['title'], 'required'], ]; } }
Create a Repository Interface
namespace app\repositories\interfaces; use mhndev\yii2Repository\Interfaces\iRepository; interface iPostRepository extends iRepository { }
Create a Repository class
namespace app\repositories; use app\repositories\interfaces\iPostRepository; use mhndev\yii2Repository\AbstractSqlArRepository; class PostRepository extends AbstractSqlArRepository implements iPostRepository { }
or
create a Repository as a Yii component
class PostRepository extends Component implements iPostRepository { const PRIMARY_KEY = 'id'; const APPLICATION_KEY = 'id'; use SqlArRepositoryTrait { init as repositoryInit; } public function init() { parent::init(); $this->repositoryInit(); } }
this approach is useful when toy have a class which is already extending a class and can't extend AbstractRepository class just like yii components by using traits you can use this classes as yii component.
if your model is using sql as it's data source and your model actually is extending yii\db\ActiveRecord your repository should extend mhndev\yii2Repository\AbstractSqlArRepository.
and if your data source is mongodb and your model actually is extending yii\mongodb\ActiveRecord your repository should extend mhndev\yii2Repository\AbstractMongoArRepository.
and consider your application can use power of both sql and document-based databses (mongo)
Attach your Repository to container
Yii::$container->set(\app\repositories\interfaces\iPostRepository::class, [ 'class' => \app\repositories\PostRepository::class ]); Yii::$container->set('postRepository', function($container, $params, $config){ return new \app\repositories\PostRepository(new \app\models\Post()); });
if you are coding in a module you can put above code in your module bootstrap file. and also you can don't use container and create repository object every where you want like this :
$postRepository = new \app\repositories\PostRepository(new \app\models\Post());
Repository Sample Usage
sample usage which I show by using a controller.
namespace app\controllers; use app\repositories\interfaces\iPostRepository; use Yii; use yii\web\Controller; use yii\web\Response; /** * PostController */ class PostController extends Controller { /** * @var iPostRepository */ protected $postRepository; /** * @var bool */ public $enableCsrfValidation = false; /** * init */ public function init() { parent::init(); $this->postRepository = Yii::$container->get('postRepository'); Yii::$app->response->format = Response::FORMAT_JSON; } /** * @return array */ public function verbs() { return [ 'create' => ['POST'], 'delete' => ['DELETE'], 'update' => ['PUT'], 'index' => ['GET'], 'show' => ['GET'], 'delete-multiple' => ['DELETE'] ]; } /** * @return mixed */ public function actionCreate() { $data = Yii::$app->request->post(); $post = $this->postRepository->create($data); return $post; } /** * @param $id */ public function actionDelete($id) { $this->postRepository->deleteOneById($id); } /** * @param $id * @return bool */ public function actionUpdate($id) { $data = Yii::$app->request->post(); $post = $this->postRepository->updateOneById($id, $data); return $post; } /** * @return mixed */ public function actionIndex() { return $this->postRepository->searchByCriteria(); } /** * @param $id * @return mixed */ public function actionShow($id) { return $this->postRepository->findOneById($id); } /** * */ public function actionDeleteMultiple() { $ids = Yii::$app->request->post()['ids']; $deletedCount = $this->postRepository->deleteManyByIds($ids); } }
mhndev/yii2-repository 适用场景与选型建议
mhndev/yii2-repository 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 10.05k 次下载、GitHub Stars 达 38, 最近一次更新时间为 2016 年 09 月 11 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「yii2」 「design pattern」 「repository pattern」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 mhndev/yii2-repository 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 mhndev/yii2-repository 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 mhndev/yii2-repository 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
A custom URL rule class for Yii 2 which allows to create translated URL rules
A Laravel package for the Repository Design Pattern.
Symfony bundle for broadway/broadway.
Inbox pattern process implementation for your Laravel Applications
A PHP console tool to generate Markdown documentation from your docblocks and types hints using templates.
A library for simple pattern matching.
统计信息
- 总下载量: 10.05k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 38
- 点击次数: 5
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2016-09-11