lukaskorl / repository
Laravel 4 的 repository 模式强大实现,拥有简单的 API
Requires
- php: >=5.4.0
- connorvg/laravel-transform: 1.*
- illuminate/support: 4.*
- league/fractal: 0.8.*
- lukaskorl/restful: 0.*
This package is not auto-updated.
Last update: 2024-09-28 14:27:44 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 许可证。