【发布时间】:2015-07-21 23:28:25
【问题描述】:
我正在尝试创建一个简洁的服务层,其中服务层作用于一个或多个存储库,每个存储库都作用于自己的雄辩模型。
例如,我可能有:
ForumService
|
+-- PostRepo extends PostInterface
| |
| +-- Post (Eloquent)
|
+-- UserRepo extends UserInterface
|
+-- User (Eloquent)
每个服务都通过ioc 定义其所需的依赖项。所以,类似:
// MessageService
// ..
public function __construct(UserInterface $userRepository,
MessageInterface $messageRepository) {
// ..
}
我的存储库是通过它们在各自服务提供商中的绑定来解析的,例如:
class UserRepositoryServiceProvider extends ServiceProvider
{
public function register()
{
$this->app>bind(
'App\Models\Repositories\User\UserInterface',
'App\Models\Repositories\User\UserRepository');
}
}
这一切都很好。每个服务都获得它需要的存储库。
为了使服务层不依赖于 eloquent,任何离开 repo 的东西都是一个简单的、不可变的数据对象。
日常用语要点:
- 只有 repo 直接与他们自己的模型对话
- Repo 返回简单、不可变的数据对象
- 服务将多个 repo 绑定在一起,并将简化的对象呈现给控制器,最终呈现给视图。
但是我无法在服务或 repo 层为associate 雄辩的模型提出一个干净的模式。
鉴于Post 模型具有belongsTo(User::class) 关系,我如何在Post 存储库层干净地创建该关系。
我试过了:
public function associate($authorId)
{
$post->author()->associate($authorId);
}
但是associate 需要一个user 雄辩的对象,而不仅仅是一个id。我可以这样做:
public function associate($authorId)
{
$post->from()->associate($userRepo->findEloquent($authorId));
}
但我觉得我正在将一个雄辩的模型呈现到一个不应该对其采取行动的回购中。
【问题讨论】:
-
您还有其他问题吗?或者答案就是你问的?
标签: laravel eloquent repository-pattern service-layer