Я пытаюсь разрешить использование символа пользователя для удаления/обновления сообщения. Я использовал политики для этого, но я мог только передать один параметр функции политики. Если я передаю больше, чем пользователь и другая переменная, переменная не будет передана в функцию.Laravel Policies - Как передать несколько аргументов для функции
Модели: Пользователь имеет много символов, персонаж может размещать несколько сообщений. Таким образом, для целей авторизации, я бы сравнить character_id Почты с идентификатором текущего персонажа ...-
согласно docs, вы можете передать больше мультипликаторов в воротах Фасад:
Gate::define('delete-comment', function ($user, $post, $comment) {
//
});
Но я не мог В любом случае, не нужно делать это с помощью политик. То, что я должен был сделать, это ввести объект Request, чтобы получить объект, необходимый для авторизации. В принципе мне даже не нужен пользовательский объект.
public function update(User $user, Post $post)
{
return $user->id === $post->user_id;
}
Использование объекта «Запрос» работает, но он чувствует себя очень взломанным. Есть ли лучший способ достичь этого?
редактировать:
В 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);
}
Спасибо за очищение, хотя у меня все еще остается один вопрос. Сама политика привязана к классу (например, к красноречивой модели), поэтому правило автоматически вызывается при передаче объекта соответствующего типа в качестве второго паремера. Если вы передаете массив, как и в примере «CommentController», какая политика используется? Он пытается разрешить первый объект в переданном массиве? – Johannes
Я провел некоторое тестирование, и документы, похоже, подразумевают, что он будет использовать несколько политик для каждого переданного аргумента, но я могу только когда-либо получить политику для первого элемента в массиве, который будет вызван. – user3158900
Я еще не читал код для политик. Важно отметить порядок переменных, как вы сказали. Он будет вызывать политику для первой переменной в зависимости от ее типа. – Johannes