Возможно, это вопрос о том, как Laravel работает внутри
Я пишу приложение. Только зарегистрированный пользователь может создавать определенные типы записей, это просто, вы просто добавляете $this->middleware('auth')
к контроллеру, и все.
Теперь я хочу что-то более сложное, пользователи с ролью admin
могут создавать / редактировать такие записи от имени какого-либо пользователя. Представьте себе что-то вроде StackOverflow, где пользователь может редактировать вопрос, заданный другим пользователем, но для создания. Вот и все, администратор может создать сообщение от имени пользователя ():
Итак, у меня есть мой create()
в моем PronController
, это что-то вроде:
function create($sid, $uid=NULL) {
// $sid is section id, where the post is going to be created... don't mind...
// if $uid (user id) is null, it will take the user from Auth::user()->id
$user = empty($uid) ? Auth::user() : User::findOrFail($uid);
// I want that only "admin" can use this $uid parameter, so I plan to use
// a Policy:
$this->authorize('create', $user);
}
Политика в PronPolicy
довольно проста:
function create(User $authUser, User $user) {
return ($authUser->id === $user->id) || $authUser->isAdmin;
}
Я думал, что это должно работать, но это не так. Он никогда не достигает этого edit()
(я разместил журнал)
Итак, я изменил строку $this->authorize()
на:
$this->authorize('createpron', $user);
И изменил UserPolicy()
(UserPolicy !!!) на:
function createpron(User $authUser, User $user) {
return ($authUser->id === $user->id) || $authUser->isAdmin;
}
Теперь это работает так, как я хотел. Но не знаю почему. Похоже, что Laravel ищет тип объекта в параметре, а затем активирует политику для этого параметра, это правильно?
Я не знаю, хотя мой код работает, он кажется мне немного грязным, так как создание «Pron» должно быть политикой Pron, а не пользователя. Я делаю что-то концептуально неправильно? как правильно это реализовать?