@Mazino

Как создать абстрактный Gate::define() в Laravel?

Как создать универсальную функцию авторизации действий через Gate::define()?
Пример:
//AuthServiceProvider.php

public function boot()
    {
        $this->registerPolicies();
        $this->registerUserPermissionPolicies();
    }

    public function registerUserPermissionPolicies()
    {
        Gate::before(function($user, $ability) {
            if ($user->isSuperAdmin()) {
                return true;
            }
        });

        Gate::define($ability, function($user, $ability) {
            return $user->hasAccess($ability);
        });
    }

Как заставить @can('ability') передать в $ability свою, строку так, чтобы это работало, по аналогии с:
//AuthServiceProvider.php
Gate::define('ability', function($user) {
    return $user->hasAccess('ability');
});


//Anywhere.blade.php
@can('ability')
//Something
@endcan
  • Вопрос задан
  • 180 просмотров
Решения вопроса 1
greabock
@greabock
Могу
Gate::before(function ($user, $ability) {
    return $user->hasAccess($ability);
});

Однако следует понимать, что все прочие шлюзы перестанут работать.
Поэтому, можно сначала выполнить проверку, присутствует ли такая "возможность" в списке допустимых "конфигурируемых возможностей"
Gate::before(function ($user, $ability) {
   if(in_array($ability,  ['see_private_posts', 'delete_private_posts'])) {
       return $user->hasAccess($ability);
   }
});


Другими словами, если замыкание переданное в метод before вернет булево значение, то это значение будет учтено. Если же это void/null, то оно не будет учтено.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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