Политики 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);
}
Ответы
Ответ 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
.