Политики Laravel - как передать несколько аргументов функции
Я пытаюсь авторизовать символ пользователя для удаления / обновления сообщения. Я использовал политики для этого, но я мог передать только один параметр функции политики. Если я передаю больше, чем пользователь и другая переменная, переменная не передается в функцию.
модели: пользователь имеет много символов, символ может размещать несколько сообщений. Поэтому для целей авторизации мне придется сравнить character_id сообщения с идентификатором текущего символа...-
согласно docs, вы можете пройти больше кратных к фасаду ворот:
Gate::define('delete-comment', function ($user, $post, $comment) {
//
});
но я все равно не мог найти, чтобы сделать это с политикой. Мне нужно было ввести объект запроса, чтобы получить объект, необходимый для авторизации. В принципе, мне даже не нужен объект User.
public function update(User $user, Post $post)
{
return $user->id === $post->user_id;
}
использование объекта запроса работает, но он чувствует себя очень взломанным. Есть ли лучший способ достичь этого?
edit:
на CharacterLocationController
у меня есть способ show
и я хочу авторизовать действие, прежде чем показывать ресурсе.
public function show(Request $request, Character $character, Location $location)
{
$this->authorize([$location, $character]);
...
}
политика зарегистрирована следующим образом:'AppLocation' => 'AppPoliciesLocationPolicy'
на 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
изменения.