mhndev/yii2-repository

Yii2中的仓库实现

1.0.10 2017-02-24 13:07 UTC

This package is auto-updated.

Last update: 2024-09-06 09:48:09 UTC


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


}