Настраиваемое сообщение об авторизации политики Laravel - PullRequest
3 голосов
/ 06 июня 2019

В моем проекте Laravel 5.8 я внедряю систему репутации, аналогичную системе Stack Exchange: например, пользователи могут отвечать на обсуждения, только если они имеют репутацию "Уровня 3".

Я хотел использовать систему политик Laravel для построения логики разрешений, как в моем файле DiscussionPolicy:

public function reply(User $user)
{
    $result = true;
    if ($user->current_level < 3) {
        $result = false;
        //I want to inject a custom error message here
    }
    return $result;
}

Все работает, но пользователи получают страницу 403 без каких-либо объяснений, и я хотел найти элегантный способ сказать им, что они не могут выполнить это действие, потому что у них нет Уровня 3.

Не могли бы вы предложить способ как-то внедрить это сообщение, чтобы оно отображалось на моей странице 403.blade.php? Я смог сделать это, мигнув переменную в сеансе, но я не думаю, что это элегантно, я хотел бы использовать что-то вроде MessageBag (Illuminate \ Support \ MessageBag).

1 Ответ

4 голосов
/ 06 июня 2019

Ответ был дан в комментариях, помещенных здесь для справки:

Laravel предоставляет эту функцию через функцию deny() в признаке HandlesAuthorization.Функция deny() выдает UnauthorizedException, но позволяет вам указать сообщение вместо простого исключения.

Заменить его return false, и вы можете отправлять пользовательские сообщения для обработки в обработчике исключений.

Пример:

public function reply(User $user)
{
    if ($user->current_level < 3) {
        $this->deny('Sorry, your level is not high enough to do that!');
    }
    return true;
}
...