Автоопределение политики Laravel

сегодня я создавал страницу профиля ПОЛЬЗОВАТЕЛЯ с управлением в ProfileController, возвращая просмотры на страницу профиля, настройки профиля и т. д.

поэтому я решил сделать некоторые правила политики для редактирования профиля и т. д.

поэтому я обнаружил, что должен использовать промежуточное программное обеспечение / ворота / политику на основе Laravel Doc. Я выбрал политику, потому что страница профиля является общедоступной, но только определенная ее часть может редактироваться автором, поэтому мне нужно @can

Итак, мои шаги:

  1. php artisan make:policy ProfilePolicy (без модели)
  2. Зарегистрированная политика для AuthServiceProvider в свойстве $policies
  3. написанные методы, такие как edit внутри ProfilePolicy

затем я начал думать, как определить это для моего контроллера, хммм, документация мне не помогает :/

поэтому я попробовал метод блейда @can('edit', $user), и он сработал, но КАК?, как определить конкретную политику для одного контроллера? (не модель), как определить несколько политик для одного контроллера

я не понимаю, как laravel Magic сделал это, может быть, из-за именования? ProfileController => ProfilePolicy ?


person Shioriu    schedule 26.05.2019    source источник


Ответы (1)


В контроллере вы можете написать это

public function edit(Profile $profile) {
   $this->authorize('edit', $profile)
}

Ларавель делает это:

  • Проверьте тип $profile, и это Profile::class
  • Проверьте политики, зарегистрированные для этого класса (ваш шаг 2)
  • Ищет метод edit в этой политике, если не найден, возвращает false, что означает, что пользователь не авторизован
  • Выполняет функцию edit(), которая возвращает true/false

В Blade директива @can делает то же самое.

Политики предназначены для привязки к моделям, это удобный способ написания правил для обработки отдельных моделей, но они могут запускаться разными способами (например, метод authorize() в контроллерах и директива @can в блейде).

person Leonardo Rossi    schedule 26.05.2019
comment
эх, я знаю, что могу, но это будет нормально, например, для редактирования запроса POST или редактирования данных Ajax, но если у вас есть страница для нескольких задач, куда вы хотите добавить встроенное редактирование, вы не можете использовать это так, также я хочу знать, как laravel выясняет с помощью политики, которую он должен связать с моим контроллером + представлением (которое возвращается контроллером), а также как определить пользовательскую политику для контроллера, например 123132321Policy (без пары имен) - person Shioriu; 28.05.2019
comment
Думаю, я ясно объяснил, как Laravel понимает, какая политика связана с какой моделью. Помните, что политику можно определить только для моделей, а не для контроллера. - person Leonardo Rossi; 28.05.2019
comment
так что невозможно дать случайную политику случайному контроллеру? например TestController и TestNewPolicy? - person Shioriu; 29.05.2019
comment
Опять же, политика применяется к МОДЕЛЯМ без контроллеров. - person Leonardo Rossi; 30.05.2019
comment
У меня нет модели профиля, поэтому ее нужно привязывать к контроллеру, а также контроллеры, возвращающие представления, и вы можете использовать метод @can, тогда как без модели ...? - person Shioriu; 31.05.2019
comment
Третий раз говорю это. Политики привязаны к МОДЕЛЯМ, поэтому, чтобы иметь политику, у вас ДОЛЖНА быть модель. Возможно, есть какое-то недоразумение. Можете ли вы объяснить мне, что вы сделали в пункте 2 вашего поста? - person Leonardo Rossi; 31.05.2019
comment
``` User::class => ProfilePolicy::class, ``` так что это связано с UserModer, поэтому я могу использовать @can для пользователя, теперь я понимаю - person Shioriu; 31.05.2019