{"id":19210646,"url":"https://github.com/mhndev/yii2-repository","last_synced_at":"2025-05-12T19:25:43.395Z","repository":{"id":62527804,"uuid":"67924456","full_name":"mhndev/yii2-repository","owner":"mhndev","description":"Yii2 repository Pattern Implementation","archived":false,"fork":false,"pushed_at":"2017-02-24T13:08:27.000Z","size":24,"stargazers_count":38,"open_issues_count":3,"forks_count":10,"subscribers_count":6,"default_branch":"develop","last_synced_at":"2025-05-12T19:25:33.734Z","etag":null,"topics":["design-patterns","mongodb","repository-pattern","yii-component"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mhndev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-09-11T10:42:39.000Z","updated_at":"2025-03-15T20:58:28.000Z","dependencies_parsed_at":"2022-11-02T14:16:47.686Z","dependency_job_id":null,"html_url":"https://github.com/mhndev/yii2-repository","commit_stats":null,"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mhndev%2Fyii2-repository","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mhndev%2Fyii2-repository/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mhndev%2Fyii2-repository/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mhndev%2Fyii2-repository/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mhndev","download_url":"https://codeload.github.com/mhndev/yii2-repository/tar.gz/refs/heads/develop","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253807046,"owners_count":21967281,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["design-patterns","mongodb","repository-pattern","yii-component"],"created_at":"2024-11-09T13:36:43.113Z","updated_at":"2025-05-12T19:25:43.368Z","avatar_url":"https://github.com/mhndev.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"Yii2 Repository Pattern implementation\n======================================\nYii2 Repository Pattern implementation in Yii2\n\nyou can read more about repository patterns here :\nhttp://deviq.com/repository-pattern/\nhttp://martinfowler.com/eaaCatalog/repository.html\nhttp://shawnmc.cool/the-repository-pattern\nhttp://stackoverflow.com/questions/16176990/proper-repository-pattern-design-in-php\n\n## Table of Contents\n\n- \u003ca href=\"#installation\"\u003eInstallation\u003c/a\u003e\n    - \u003ca href=\"#composer\"\u003eComposer\u003c/a\u003e\n- \u003ca href=\"#methods\"\u003eMethods\u003c/a\u003e\n    - \u003ca href=\"#prettusrepositorycontractsrepositoryinterface\"\u003eRepositoryInterface\u003c/a\u003e\n\n- \u003ca href=\"#usage\"\u003eUsage\u003c/a\u003e\n\t- \u003ca href=\"#create-a-model\"\u003eCreate a Model\u003c/a\u003e\n\t- \u003ca href=\"#create-a-repository\"\u003eCreate a Repository\u003c/a\u003e\n\t- \u003ca href=\"#attach-your-repository-to-container\"\u003eAttach your Repository to container\u003c/a\u003e\n\t- \u003ca href=\"#repository-sample-usage\"\u003eRepository Sample Usage\u003c/a\u003e\n\t\n\t\n## Installation\n\n### Composer\nThe preferred way to install this extension is through [composer](http://getcomposer.org/download/).\n\nEither run\n\n```\ncomposer require --prefer-dist mhndev/yii2-repository \"1.*\"\n```\n\nor add\n\n```\n\"mhndev/yii2-repository\": \"1.*\"\n```\n\nto the require section of your `composer.json` file.\n\n\n## Methods\n\n### mhndev\\yii2Repository\\Interfaces\\iRepository\n\n```php\n    public function with(array $with = []);\n\n    public function columns(array $columns = ['*']);\n\n    public function limit($limit = 10);\n\n    public function orderBy($orderBy, $sort = 'DESC');\n\n    public function create(array $data);\n\n    public function createMany(array $data);\n\n    public function findOneById($id, $returnArray = false);\n\n    public function findOneBy($key, $value, $operation = '=', $returnArray = false);\n\n    public function findManyBy($key, $value, $operation = '=', $withPagination = true, $returnArray = false);\n\n    public function findManyByIds(array $ids, $withPagination = true, $returnArray = false);\n\n    public function findAll($withPagination = true, $returnArray = false);\n\n    public function findManyByCriteria(array $criteria = [], $withPagination = true, $with = [], $returnArray = false);\n\n    public function updateOneById($id, array $data = []);\n\n    public function updateOneBy($key, $value, array $data = []);\n\n    public function updateOneByCriteria(array $criteria, array $data = []);\n\n    public function updateManyBy($key, $value, array $data = [], $operation = '=');\n\n    public function updateManyByCriteria(array $criteria = [], array $data = []);\n\n    public function updateManyByIds(array $ids, array $data = []);\n\n    public function deleteOneById($id);\n\n    public function allExist(array $ids);\n\n    public function deleteOneBy($key, $value, $operation = '=');\n\n    public function deleteOneByCriteria(array $criteria = []);\n\n    public function deleteManyBy($key, $value, $operation = '=');\n\n    public function deleteManyByCriteria(array $criteria = []);\n\n    public function searchByCriteria();\n\n    public function deleteManyByIds(array $ids);\n\n    public function inc($id, $field, $count = 1);\n\n    public function dec($id, $field, $count = 1);\n```\n \n## Usage\n\n### Create a Model\n\ncreate your ActiveRecord Model :\n\n```php\nnamespace app\\models;\n\n\nuse yii\\db\\ActiveRecord;\n\n/**\n * Class City\n * @package app\\models\n */\nclass Post extends ActiveRecord\n{\n\n    /**\n     * @return string\n     */\n    public static function tableName()\n    {\n        return 'posts';\n\n    }\n\n    /**\n     * @return array\n     */\n    public function rules()\n    {\n        return [\n\n            [['title'], 'required'],\n\n        ];\n    }\n\n\n}\n\n```\n\n### Create a Repository Interface\n```php\nnamespace app\\repositories\\interfaces;\nuse mhndev\\yii2Repository\\Interfaces\\iRepository;\n\ninterface iPostRepository extends iRepository\n{\n\n}\n\n```\n### Create a Repository class\n\n```php\nnamespace app\\repositories;\n\nuse app\\repositories\\interfaces\\iPostRepository;\nuse mhndev\\yii2Repository\\AbstractSqlArRepository;\n\nclass PostRepository extends AbstractSqlArRepository implements iPostRepository\n{\n\n}\n\n```\n\nor\n\n### create a Repository as a Yii component\n\n```php\nclass PostRepository extends Component implements iPostRepository\n{\n\n    const PRIMARY_KEY = 'id';\n\n    const APPLICATION_KEY = 'id';\n\n\n    use SqlArRepositoryTrait {\n        init as repositoryInit;\n    }\n\n\n    public function init()\n    {\n        parent::init();\n\n        $this-\u003erepositoryInit();\n    }\n}\n\n\n```\n\nthis approach is useful when toy have a class which is already extending a class\nand can't extend AbstractRepository class just like yii components\nby using traits you can use this classes as yii component.\n\n\n\nif your model is using sql as it's data source and your model actually is extending yii\\db\\ActiveRecord\nyour repository should extend mhndev\\yii2Repository\\AbstractSqlArRepository.\n\nand if your data source is mongodb and your model actually is extending yii\\mongodb\\ActiveRecord\nyour repository should extend mhndev\\yii2Repository\\AbstractMongoArRepository.\n\n\nand consider your application can use power of both sql and document-based databses (mongo)\n### Attach your Repository to container\n```php\n\nYii::$container-\u003eset(\\app\\repositories\\interfaces\\iPostRepository::class, [\n    'class' =\u003e \\app\\repositories\\PostRepository::class\n]);\n\n\nYii::$container-\u003eset('postRepository', function($container, $params, $config){\n    return new \\app\\repositories\\PostRepository(new \\app\\models\\Post());\n});\n\n\n```\n if you are coding in a module you can put above code in your module bootstrap file.\n and also you can don't use container and create repository object every where you want like this :\n \n ```php\n $postRepository = new \\app\\repositories\\PostRepository(new \\app\\models\\Post());\n\n ```\n \n### Repository Sample Usage\n \n sample usage which I show by using a controller.\n \n ```php\n namespace app\\controllers;\n \n use app\\repositories\\interfaces\\iPostRepository;\n use Yii;\n use yii\\web\\Controller;\n use yii\\web\\Response;\n \n /**\n  * PostController\n  */\n class PostController extends Controller\n {\n \n     /**\n      * @var iPostRepository\n      */\n     protected $postRepository;\n \n \n     /**\n      * @var bool\n      */\n     public $enableCsrfValidation = false;\n \n \n     /**\n      * init\n      */\n     public function init()\n     {\n         parent::init();\n         $this-\u003epostRepository = Yii::$container-\u003eget('postRepository');\n \n         Yii::$app-\u003eresponse-\u003eformat = Response::FORMAT_JSON;\n     }\n \n     /**\n      * @return array\n      */\n     public function verbs()\n     {\n         return [\n             'create'   =\u003e ['POST'],\n             'delete'   =\u003e ['DELETE'],\n             'update'   =\u003e ['PUT'],\n             'index'    =\u003e ['GET'],\n             'show'     =\u003e ['GET'],\n             'delete-multiple' =\u003e ['DELETE']\n         ];\n     }\n \n \n     /**\n      * @return mixed\n      */\n     public function actionCreate()\n     {\n         $data = Yii::$app-\u003erequest-\u003epost();\n \n         $post = $this-\u003epostRepository-\u003ecreate($data);\n \n         return $post;\n     }\n \n \n     /**\n      * @param $id\n      */\n     public function actionDelete($id)\n     {\n         $this-\u003epostRepository-\u003edeleteOneById($id);\n     }\n \n     /**\n      * @param $id\n      * @return bool\n      */\n     public function actionUpdate($id)\n     {\n         $data = Yii::$app-\u003erequest-\u003epost();\n \n         $post = $this-\u003epostRepository-\u003eupdateOneById($id, $data);\n \n         return $post;\n     }\n \n \n     /**\n      * @return mixed\n      */\n     public function actionIndex()\n     {\n         return $this-\u003epostRepository-\u003esearchByCriteria();\n     }\n \n \n     /**\n      * @param $id\n      * @return mixed\n      */\n     public function actionShow($id)\n     {\n         return $this-\u003epostRepository-\u003efindOneById($id);\n     }\n \n \n     /**\n      *\n      */\n     public function actionDeleteMultiple()\n     {\n         $ids = Yii::$app-\u003erequest-\u003epost()['ids'];\n \n         $deletedCount = $this-\u003epostRepository-\u003edeleteManyByIds($ids);\n     }\n \n \n }\n\n ```\n \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmhndev%2Fyii2-repository","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmhndev%2Fyii2-repository","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmhndev%2Fyii2-repository/lists"}