@lexstile

Как можно объединить условия трех зависимых сущностей в policy?

Необходимо проверить пользователя и проект - либо isLinkedOwner - создатель проекта, либо isLinked - сотрудник проекта.
Необходимо проверить, что меню принадлежит проекту - delete - тут и возникли проблемы (если мы берем меню другого проекта, он подтягивает в полиси по связи именно проект текущего меню, а не который мы передавали. Только в контроллере модели те, которые нужны, в полиси по связи они всегда принадлежат друг другу - какое бы мы меню не передали).

# ProjectPolicy

    public function isLinked(User $user, Project $project)
    {
        return $project->users()->exists($user->id);
    }

    public function isLinkedOwner(User $user, Project $project) {
        return $user->id === $project->user_id;
    }

    public function isAdmin(User $user, Project $project) {
        return $this->isLinkedOwner($user, $project) || ($user->isAdmin() && $this->isLinked($user, $project));
    }

    # MenuPolicy
    public function __construct()
    {
        $this->projectPolicy = new ProjectPolicy;
    }

    public function delete(User $user, Menu $menu) {
        // dd($menu->project->id, $menu->project_id);
        return $this->projectPolicy->isAdmin($user, $menu->project);
    }

    # MenuModel
    public function project()
    {
        return $this->belongsTo(Project::class);
    }
  • Вопрос задан
  • 90 просмотров
Решения вопроса 1
iMedved2009
@iMedved2009
Не люблю людей
public function delete(User $user, Menu $menu) {
        // dd($menu->project->id, $menu->project_id);
        return $this->projectPolicy->isAdmin($user, $menu->project);
    }

Зачем вы так? Ну у вас уже есть пользователь. Есть модель Project. Нахрена вы тащите руками Policy. Ну определите разрешение на модификацию элементов меню в ProjectPolicy и используйте на здоровье.

public function delete(User $user, Menu $menu) {
        return $user->can('delete-menu', $menu->project);
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы