可以从 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 调用(例如关于您的用例的 createddeleted