2016-04-07 1 views
8

Я пытаюсь разрешить использование символа пользователя для удаления/обновления сообщения. Я использовал политики для этого, но я мог только передать один параметр функции политики. Если я передаю больше, чем пользователь и другая переменная, переменная не будет передана в функцию.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); 
} 

ответ

13

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

При использовании

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.

+1

Спасибо за очищение, хотя у меня все еще остается один вопрос. Сама политика привязана к классу (например, к красноречивой модели), поэтому правило автоматически вызывается при передаче объекта соответствующего типа в качестве второго паремера. Если вы передаете массив, как и в примере «CommentController», какая политика используется? Он пытается разрешить первый объект в переданном массиве? – Johannes

+0

Я провел некоторое тестирование, и документы, похоже, подразумевают, что он будет использовать несколько политик для каждого переданного аргумента, но я могу только когда-либо получить политику для первого элемента в массиве, который будет вызван. – user3158900

+0

Я еще не читал код для политик. Важно отметить порядок переменных, как вы сказали. Он будет вызывать политику для первой переменной в зависимости от ее типа. – Johannes