【发布时间】:2014-08-13 00:26:51
【问题描述】:
在阅读了一些教程并主要在Laracasts 上观看视频后,我正在考虑使用Repositories 在我的网站中添加一个抽象层,该抽象层将通过一个接口注入我的Controllers。 Repositories 用于抽象如何检索 Model 并隐藏一些业务逻辑。使用Laravel 中提供的Bind 方法,这看起来超级简单方便。
将unit tests 添加到项目中听起来非常有趣,但我不明白应该如何处理Model。
例如,假设我们试图通过创建:
将旧的User 模型隐藏在存储库后面
interface UserRepositoryInterface {
public function getAll();
// ...
}
那么,为了支持Laravel提供的标准User模型,定义为:
class User extends Eloquent implements UserInterface, RemindableInterface {
// ...
}
我们创建了UserRepositoryInterface 的Eloquent 实现:
class EloquentUserRepository extends UserRepositoryInterface {
public function getAll() {
return User::all();
}
}
我不明白的部分是,现在Repository 不返回“通用”Model,而是返回Eloquent 模型!对我来说,其他Repositories 应该返回相同类型的Model 对我来说没有意义,如果不是这种情况,如果Models 之间根本没有相关性,那么拥有Repositories 有什么意义?退了吗?
那么Repository 模式在Laravel 中的正确用法是什么?
【问题讨论】:
-
当我严格希望存储库返回非特定于实现的数据时,我通常会在
EloquentUserRepository::getAll();中使用return User::all()->toArray();。但我自己有时会违反这条规则,因为返回 Eloquent 模型非常方便。 :p 我希望 Eloquent 有一个toObject()方法! -
事实是,如果你不需要那个额外的层,那就不要。必要时实施。当你这样做时,这是正确的,返回
Eloquent并不是要走的路。相反,您可以返回array或实现 @Unnawut 所说的内容,例如喜欢这里的安德烈亚斯:github.com/anlutro/laravel-4-core/blob/master/src/Eloquent/… -
@Unnawut return (object) $this->toArray();
标签: php laravel model repository eloquent