atrakeur/repository

此软件包最新版本(dev-master)没有可用的许可信息。

laravel的仓库模式实现,使用标准PHP对象解耦Eloquent模型

dev-master 2015-02-04 20:08 UTC

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。请确保它没有副作用。顺便说一句,请尽量保持简单。