lukaskorl/repository

Laravel 4 的 repository 模式强大实现,拥有简单的 API

v0.8.4 2014-06-30 09:47 UTC

README

Repository 是 Laravel 4 的 repository 模式的强大实现,拥有简单的 API。

在您的 Laravel 项目中安装 Repository,只需简单执行 composer require lukaskorl/repository

注意Repository 目前正在积极开发中。我很快将发布稳定版本 1.0.0。在此之前,接口可能会发生变化。我不建议在生产代码中将 Repository 作为 dev-* 依赖项使用。

介绍

仓库充当领域逻辑和数据映射层之间的中介。这意味着仓库位于处理您的业务案例的代码和处理数据库、API、文件系统等的代码之间。

您可以通过多种方式从使用仓库中受益

  • 您可以将对数据复杂查询的封装在仓库中,并通过简单的方法调用在任何地方访问您的业务逻辑。
  • 可以完全切换数据表示,从数据库切换到 API,而无需触及业务逻辑中的一行代码。
  • 仓库可以将数据库列与您的其他代码解耦。通过转换属性名称并应用正确的数据类型到属性。

还有其他好处,这里不再讨论。如果您想了解更多关于 repository 模式的信息,请继续阅读 Martin Fowler 的网站

基本用法

Repository 提供了一套工具,方便您实现 repository 模式。默认情况下,Repository 仅实现 CRUD 风格的查询。但您可以根据需要增强您的仓库,使用其他方法和复杂查询。

一个简单的用例场景包括 Repository 提供的三个工具

  • (可选) 提供 Lukaskorl\Repository\Transformable\Transformer 抽象类的实现。这个类将处理属性的重命名和数据类型。
  • Lukaskorl\Repository\AbstractRepository 的实现(即如果您想使用 Eloquent 作为 ORM,则为 Lukaskorl\Repository\EloquentRepository)。您可以自由地实现自己的仓库策略,例如访问 API 或其他数据库。我将在未来添加更多实现。
  • Lukaskorl\Repository\RepositoryController

转换器

转换器的使用是可选的。如果您不希望重命名属性或确保数据类型,则可以使用 Repository 而不使用转换器。通常,您的转换器将如下所示

<?php namespace Acme\Transformers;

use Lukaskorl\Repository\Transformable\Transformer;

class PostsTransformer extends Transformer {

	protected $definitions = [
	    'id' => 'int',
	    'active' => 'boolean'
	];

	protected $aliases = [
	    'id' => 'identifier'
	];

} 

$definitions 是一个关联数组,作为字段和数据类型的映射。当实体返回时,将应用这些数据类型到属性。

$aliases 用于隐藏内部数据库列名称,并仅公开简洁的 API。

有关转换器如何工作的更多信息,请访问 ConnorVG/laravel-transform 的 GitHub 页面。

仓库

Laravel 4 中仓库的典型实现将如下所示

<?php namespace Acme\Repository;

use Acme\Transformers\PostsTransformer;
use Lukaskorl\Repository\EloquentRepository;

class EloquentPostsRepository extends EloquentRepository {

    protected $model = "Post";

    public function __construct(PostsTransformer $transformer)
    {
    	$this->transformer = $transformer;
	}

}

通过类型提示 PostsTransformer,Laravel IoC 将在仓库实例化时自动注入您的转换器。成员 $model 包含将用于查询数据库的 Eloquent 模型的类名。

控制器

本包提供了一个控制器,该控制器自动在所有 CRUD 操作中使用存储库。您可以直接扩展 Lukaskorl\Repository\RepositoryController。此控制器包含默认实现,但您可以自由地覆盖任何方法以更改其行为。

<?php

use Acme\Repository\EloquentPostsRepository;
use Lukaskorl\Repository\RepositoryController;

class PostsController extends RepositoryController {

	public function __construct(EloquentPostsRepository $repository)
	{
    	$this->setRepository($repository);
    }

}

如果您向构造函数传递一个存储库实现,Laravel IoC 将自动将存储库注入到您的控制器中。只需在控制器上设置存储库即可。

默认情况下,控制器将以 RESTful 方式响应。有关 RESTful 行为的更多信息,请参阅 GitHub 上的 RESTful

钩子

存储库将在各种操作上触发各种事件。存储库事件的命名模式为 repository.<领域>.<动作>,其中 <领域> 是在 EloquentRepository 中使用的模型的名称。目前触发了以下 <动作>

  • repository.<领域>.creating 在模型持久化之前触发。如果您想将验证服务钩子注册到此事件上,并在验证失败时抛出异常。如果您扩展了 Lukaskorl\Repository\RepositoryController,则 create 将自动拦截 Lukaskorl\Repository\Validation\ValidationException 并返回 RESTful 422 响应。
  • repository.<领域>.created 在模型持久化之后触发。

注意:如果您的模型位于命名空间下(例如 Acme\Stuff\Something),则事件的 <领域> 将以对象点表示法表示:repository.acme.stuff.something.<动作>

许可证

存储库 是开源软件,采用 MIT 许可证