atrakeur / repository
laravel的仓库模式实现,使用标准PHP对象解耦Eloquent模型
Requires
- php: >=5.4.0
- illuminate/support: 5.0.*
This package is not auto-updated.
Last update: 2024-09-24 03:23:23 UTC
README
目标
- 提供laravel框架下使用仓库实现公共接口。
- 为您提供一个良好的起点,以创建简单易维护的laravel应用程序。
- 通过几行代码鼓励使用仓库模式的好行为
- 通过抽象复杂行为简化您的代码
- 清理模型和控制器。 (同时保持仓库干净!)
此软件包的作用
这里的目的是通过使用标准PHP对象(stdClass和数组)来抽象Eloquent模型。这样,您以后可以切换到另一个数据源,如MongoDB,而无需修改您的模型。所有转换的冗余都已从您的代码中处理。
此软件包处理获取Eloquent数据并将其转换为普通PHP对象。以后将根据需要添加更多数据提供者。
此软件包使您能够使用与eloquent模型相同的语法来显示数据($model->data语法),而不同于toArray方法。
安装
导入软件包
要安装,请简单地将以下行添加到您的composer.json中,并运行composer update
"atrakeur/repository": "dev-master"
然后添加以下服务提供程序到您的app.php
'Atrakeur\Repository\RepositoryServiceProvider',
最后发布软件包配置
php artisan config:publish atrakeur/repository
创建您的第一个仓库
基本的仓库定义看起来像这样
<?php use \Atrakeur\Repository\Eloquent\EloquentConverter; use \Atrakeur\Repository\Eloquent\AbstractEloquentRepository; class CategoryRepository extends AbstractEloquentRepository { public function __construct(Category $model, EloquentConverter $converter) { parent::__construct($model, $converter); } }
在这里,我们扩展了AbstractEloquentRepository,因为我们正在使用Eloquent作为底层数据提供者。目标是使您能够切换数据提供者,但仍然保持相同的外部接口,以保持您的控制器和视图不变;
当您需要切换到另一个提供者时,您只需将AbstractEloquentRepository更改为其他东西,如AbstractMongoRepository,然后所有控制器都将正常工作。
使用仓库
在您的控制器中,您可以使用IoC自动注入仓库。
只需更改您的构造函数为类似以下内容
public function __construct(CategoryRepository $categories) { parent::__construct(); $this->categories = $categories; }
现在,您只需将所有对模型的调用重写为仓库。例如,代码
Categories::find(1)->with('articles');
变为
$this->categories->byId(1)->with(array('articles'))->getOne();
关键是将此代码放在CategoryRepository类中。因此,在您的控制器中,您的代码现在是$this->categories->getCategorie(1);
更简洁吗?
贡献
目前,此软件包仅支持Eloquent模型,但通过使用标准PHP对象,此软件包已准备好支持PHP本身支持的任何其他提供者。
当然,我很乐意在实现此类数据提供者方面提供帮助。我非常感谢您对这一主题所做的任何贡献。
通常,每种仓库类型都由两个类组成:AbstractRepository,其中包含获取数据的原语,以及Converter,它用于将仓库返回的对象转换为标准PHP对象。
要贡献,只需编写自己的仓库类型,然后提交pull request。请确保它没有副作用。顺便说一句,请尽量保持简单。