Политики 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 изменения.