可以从 laravel 中的存储库模式调用事件吗?
Is it okey to call events from Repository Pattern in laravel?
我有创建模型的存储库模式。每次创建模型时我都想调用事件,我应该从控制器还是从存储库中调用事件?如果我在存储库模式中这样做,我会打破单一责任原则吗?
这是我的代码示例
class FriendshipRepository implements IFriendshipStorageRepository
{
public function create(User $user, User $follower): Friendship
{
$friendship = Friendship::create([
'user_id' => $user->id,
'follower_id' => $follower->id
]);
event(new FriendshipCreatedEvent($friendship));
return $friendship;
}
public function destroy(User $user, User $userToUnfollow)
{
$friendship = $user->getFriendship($userToUnfollow);
$friendship->delete();
event(new FriendshipDeletedEvent($friendship));
}
}
或者我应该在控制器和存储库之间多做一层吗?
新层将使用存储库并调用事件,但控制器只会调用该新层。
我喜欢将服务用于此类用例。您的控制器可以调用 NewFriendshipService
.
此服务将实现一个工作流,如下所示:
- 在数据库中创建关系(使用您的存储库)
- 向新朋友发送通知
- 计算新的友谊推荐("you may also know this person")
- ...
然后该服务可以充当控制器和存储库之间的 "middleware"。这里的良好做法是,服务只实现工作流,而不直接实现业务逻辑。
为了尊重单一职责原则,可以使用观察者class Eloquent Observers.
它的方法 "automatically" 在您执行 Eloquent 操作时由 Laravel 调用(例如关于您的用例的 created
和 deleted
)
我有创建模型的存储库模式。每次创建模型时我都想调用事件,我应该从控制器还是从存储库中调用事件?如果我在存储库模式中这样做,我会打破单一责任原则吗? 这是我的代码示例
class FriendshipRepository implements IFriendshipStorageRepository
{
public function create(User $user, User $follower): Friendship
{
$friendship = Friendship::create([
'user_id' => $user->id,
'follower_id' => $follower->id
]);
event(new FriendshipCreatedEvent($friendship));
return $friendship;
}
public function destroy(User $user, User $userToUnfollow)
{
$friendship = $user->getFriendship($userToUnfollow);
$friendship->delete();
event(new FriendshipDeletedEvent($friendship));
}
}
或者我应该在控制器和存储库之间多做一层吗? 新层将使用存储库并调用事件,但控制器只会调用该新层。
我喜欢将服务用于此类用例。您的控制器可以调用 NewFriendshipService
.
此服务将实现一个工作流,如下所示:
- 在数据库中创建关系(使用您的存储库)
- 向新朋友发送通知
- 计算新的友谊推荐("you may also know this person")
- ...
然后该服务可以充当控制器和存储库之间的 "middleware"。这里的良好做法是,服务只实现工作流,而不直接实现业务逻辑。
为了尊重单一职责原则,可以使用观察者class Eloquent Observers.
它的方法 "automatically" 在您执行 Eloquent 操作时由 Laravel 调用(例如关于您的用例的 created
和 deleted
)