在雄辩模型中处理ACL的最佳模式或方法是什么?

时间:2019-05-17 09:23:43

标签: php laravel design-patterns

我正在使用Laravel创建REST API,其中基于用户角色的终结点有多个参数。

当前在服务中使用if条件对此进行检查。

class UserService
{
    public function update(array $attribute, $userId)
    {
        $userRepository = app(\App\Repositories\UserRepositoryInterface::class);
        $user = $userRepository->get($userId);
        $allowedUpdatableFieldForTeachers = ['name', 'age', 'graduated_at'];
        $allowedUpdatableFieldForSupervisor = ['name', 'age', 'graduated_at', 'balance', 'salary'];
        if ($user->role == 'teacher') {
            $userRepository->update(Arr::only($attribute, $allowedUpdatableFieldForTeachers), $userId);
        }
        if ($user->role == 'supervisor') {
            $userRepository->update(Arr::only($attribute, $allowedUpdatableFieldForSupervisor), $userId);
        }
    }
}

然而,它违反了单一责任原则。 那么解决这个问题的最佳实践/模式是什么。

1 个答案:

答案 0 :(得分:0)

SRP不适用于您软件中的所有类别。

对于典型的类,应使用SRP,因为它会增加类的可重用性。没有人愿意只重用一个承担两个职责的班级。如果他接受上课,每次不必要的责任代码得到更新时,这对他来说都会很烦。

但是对于您软件boundary上的类,SRP不适用。在这里,您可以使用多个典型类,并以某种方式组合它们以处理用户的请求。通常,不需要在边界处重用这些类。因此,不需要对它们应用SRP。换句话说,这些类旨在承担多种责任。

您的UserService类就是这样的地方。所以,不用担心。

您可以阅读有关SRP here的更多信息。 IMO,这是有关该原理的最好的文章。