2016-03-09 2 views
3

Я понимаю, что способности, определенные с помощью политик действительно полиморфные, а это означает, что:Являются ли способности Laravel полиморфными по аргументу?

Gate::allows('update', $post); 
Gate::allows('update', $comment); 

будет вызывать различные функции, если два объекта различных классов, которые зарегистрированы с различными политиками:

protected $policies = [ 
    Post::class => PostPolicy::class, 
    Comment::class => CommentPolicy::class, 
]; 

Хотя мне кажется, что способности, определенные с помощью $gate->define(), равны , а не полиморфные, что означает, что два вызова, использующие одно и то же имя политики, будут перезаписывать каждый прочее:

$gate->define('update', function ($user, $post) { /* THIS IS THROWN AWAY! */ }); 
$gate->define('update', function ($user, $comment) { /* the last one is kept */ }); 

Это правильно?

Есть ли связь между именами способностей приведены в документации для не-полиморфных примеров (update-post, update-comment) и показанных в примерах политики (update)?

Я имею в виду, что суффикс -post добавлен или сделан Laravel? Или это просто пример?

ответ

2

Значительная разница между определяемыми политикой способностями и способностями, определяемыми затвором.

  • При использовании define метода ворота, ваше имя способность будет added to the abilities array of the gate с ключом массива, являющееся именем способности. Если вы определяете другую способность с тем же именем (например, update), она будет переопределять старую, так как не может быть двух ключей массива с тем же именем. Таким образом, в этом случае уникальным идентификатором в define($ability, $callback) является способность.

  • И наоборот, когда вы определяете класс политики, имена способностей являются фактическими именами методов политики. Таким образом, вы можете иметь несколько классов с одинаковыми методами (например, update), поскольку в этом случае уникальный идентификатор является классом, переданным с первым аргументом, поэтому Post::class.

В какой-то момент в ходе проверки авторизации, проверки класса Gate if there's a policy associated with the first argument passed и вызывает метод политики или определенный обратный вызов способности на основе этой оценки.

Так что идея состоит в том, что вы не можете иметь две способности с тем же именем при помощи define, потому что ниже не представляется возможным:

$abilities = [ 
    'update' => $callback1, 
    'update' => $callback2, // this will override the first 
] 

Так же, как при использовании $policies вы не можете связать более чем один Политика в классе:

$policies = [ 
    Post::class => PostPolicy::class, 
    Post::class => AnotherPostPolicy::class, // this will override the first one 
]; 

так что, если вы хотите использовать update как имя способности более чем одной модели, просто использовать политику.

Это также должно ответить на окончательный вопрос: Laravel не делает ничего или не добавляет ничего, имена возможностей - это либо строки, которые вы передаете define, либо имена методов, которые вы определяете на классах политик.

+0

Очень ясно, спасибо – Tobia

+0

Ваше приветствие. – Bogdan

Смежные вопросы