Подтвердить что ты не робот

Политики Laravel - Как передать несколько аргументов для работы

Я пытаюсь авторизовать символ пользователя для удаления/обновления сообщения. Я использовал политики для этого, но я мог только передать один параметр функции политики. Если я передаю больше, чем пользователь и другая переменная, переменная не будет передана в функцию.

Модели: у пользователя много символов, персонаж может размещать несколько сообщений. Поэтому для целей авторизации мне пришлось бы сравнить post character_id с текущим символом id...-

В docs вы можете передать больше кратных к фазе Gate:

Gate::define('delete-comment', function ($user, $post, $comment) {
    //
});

Но я не мог найти так, чтобы сделать это с помощью политик. То, что я должен был сделать, это ввести объект Request, чтобы получить объект, необходимый для авторизации. В принципе мне даже не нужен пользовательский объект.

public function update(User $user, Post $post)
{
    return $user->id === $post->user_id;
}

Использование объекта Request работает, но он чувствует себя очень взломанным. Есть ли лучший способ достичь этого?

изменить:

В CharacterLocationController у меня есть метод show, и я хочу разрешить действие перед показом ресурса.

public function show(Request $request, Character $character, Location $location)
{
    $this->authorize([$location, $character]);
    ...
}

Политика регистрируется следующим образом: 'App\Location' => 'App\Policies\LocationPolicy' в AuthServiceProvider

Я сбросил массив, переданный функции политики, и он выводит только $location.

public function show(User $user, $data) {
    dd($data); // expecting location and character
    return !$location->private || $location->authorized->contains($this->character);
}
4b9b3361

Ответ 1

Я думаю, что здесь возможно какая-то путаница в том, какие функции делают что.

Когда вы используете

Gate::define('delete-comment', function ($user, $post, $comment) {
    //
});

Или в CommentPolicy

public function delete(User $user, Post $post, Comment $comment)
{
    return $user->id === $post->user_id;
}

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

Это когда вы на самом деле проверяете, есть ли у кого-то разрешение что-то делать, когда вы должны передавать эти предметы. Например, когда вы делаете следующее,

if (Gate::allows('delete-comment', [$post, $comment])) {
    // 
}

Или, если в CommentController

$this->authorize('delete', [$post, $comment]);

Это то, что контролирует, какие параметры будут переданы политике или методу Gate::define. В соответствии с документами параметр $user уже добавлен для вас, поэтому в этом случае вам нужно только беспокоиться о передаче правильных изменений $post и $comment.