mhndev / yii2-repository
Yii2中的仓库实现
Requires
- yiisoft/yii2: *
Suggests
- yiisoft/yii2-mongodb: needed if you want to use mongodb as your dbms instead of relational dbms
README
Yii2 仓库模式实现
你可以在这里了解更多关于仓库模式的信息: http://deviq.com/repository-pattern/ https://martinfowler.com.cn/eaaCatalog/repository.html http://shawnmc.cool/the-repository-pattern http://stackoverflow.com/questions/16176990/proper-repository-pattern-design-in-php
目录
安装
Composer
通过 composer 安装此扩展是首选方式。
运行
composer require --prefer-dist mhndev/yii2-repository "1.*"
或者
"mhndev/yii2-repository": "1.*"
添加到你的 composer.json 文件的 require 部分。
方法
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);
使用
创建模型
创建你的 ActiveRecord 模型
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'], ]; } }
创建仓库接口
namespace app\repositories\interfaces; use mhndev\yii2Repository\Interfaces\iRepository; interface iPostRepository extends iRepository { }
创建仓库类
namespace app\repositories; use app\repositories\interfaces\iPostRepository; use mhndev\yii2Repository\AbstractSqlArRepository; class PostRepository extends AbstractSqlArRepository implements iPostRepository { }
或者
创建一个作为 Yii 组件的仓库
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(); } }
这种方法在有类已经继承了一个类,不能像使用 traits 一样扩展 AbstractRepository 类的情况下很有用,你可以将这些类作为 Yii 组件使用。
如果你的模型使用 SQL 作为其数据源,并且你的模型实际上扩展了 yii\db\ActiveRecord,则你的仓库应该扩展 mhndev\yii2Repository\AbstractSqlArRepository。
如果数据源是 MongoDB,并且你的模型实际上扩展了 yii\mongodb\ActiveRecord,则你的仓库应该扩展 mhndev\yii2Repository\AbstractMongoArRepository。
如果你的应用可以使用 SQL 和文档型数据库(Mongo)的强大功能
将仓库附加到容器
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()); });
如果你在一个模块中编码,你可以将上述代码放在你的模块启动文件中。你也可以不使用容器,在任何需要的地方创建仓库对象,如下所示
$postRepository = new \app\repositories\PostRepository(new \app\models\Post());
仓库示例使用
以下是一个使用控制器的示例使用方法。
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); } }