Как реализовать общую политику для разных контроллеров в Laravel?
Добрый день, друзья.
Добрался до политик в Laravel и сразу же вопрос - реально ли сделать общую политику для разных контроллеров?
Да, вы можете предложить использовать посредника, в котором проверить права, но мне необходимо обработать как положительный результат, так и отрицательный. Если углубиться в задачу, то я имею одну таблицу пользователей, но есть флаг, который указывает на то, админ это или простой пользователь. Есть личный кабинет, который должен быть доступен только простому пользователю, а админу должно выводиться сообщение, что у него нет прав к этому разделу. Аналогично с корзиной и многим другим.
Есть другой вариант, в модели пользователя я уже создал два метода: isRegularUser и isSpecialUser, которые возвращают булевые значения. Это решение, которое я могу использовать прямо сейчас, но хотелось бы понять, можно ли в Laravel сделать общую политику? Может проглядел, но в мануале в разделе "регистрация политик" ясно видно, что каждая политика привязывается к определённому классу. Или же я могу привязать одну и ту же политику к разным классам, но что делать в случае, когда нужно дополнить правила персональной политикой?
Повторюсь, я понимаю, что это можно решить через модель пользователя, но в целях обучения решил спросить более опытных! Благодарю за понимание.
Tesla: меня сперва интересуют стоковые возможности фреймворка. Про сторонние многочисленные пакеты слышал, буду пробовать, но пока нужно разобраться с Laravel получше :-)
Сложно)
В таком случае можно использовать связи: многие ко многим.
К примеру: роль "администратор" может иметь много пользователей и подобно.
В документации приводится очень полезная информация насчет связей.
Покопаюсь завтра, на свежую голову) Но пока решил остановиться на своём методе из модели пользователя, ибо 8 релиз :-) Будет времячко, нужно будет исправить
gubin_niko: ну тут даже дело вкуса, как по мне(я не совсем представил вашу задачу), можно просто сделать проверку прям во вьюхе( @if($users->roles == 3) redirect ), но это так, чисто для себя, чтобы не парится)
А так: laravel.su/docs/5.2/eloquent-relationships
Переводы с laravel.com, очень хорошо "разжовано", приведен пример и использование каждой связи)
deadmemoras: а я практически так и сделал :-) Только не к переменной обращаюсь, а к методу, который внутри и сравнивает флаг. Суть в том, что есть пользователь, он или админ или нет. А вот у админов есть свои роли, для работы в админке. Но чтобы админу не дать открыть управление информацией, которая присуща только простому смертному, нужно его отсекать в нужных контроллерах. Так что пока так и сделал. Вашу ссылку прочитаю обязательно, сайт этот знаю - нравится!
gubin_niko: да тут дело вкуса и лени. Если роли будут использоваться практически в каждом куске - имеется смысл через связи, так как каждый раз проверять во вьюхе не то.
Есть еще Middleware (можешь почитать), но у меня в проекте не так уж и много всего(пока только 2 проверки), поэтому я прибег к стандартному полю 'roles' в таблице 'users' , и роли от 0 до 3 соответственно )
deadmemoras: про посредников знаю, но они не подходят, ибо мне нужно в контроллере перехватить как true, так и false, т.е. редирект мне не сгодится, ибо нужно сообщить пользователю о том, что он не прав и путь ему "сюда" заказан. Хотя, пока ехал домой, решил, что зачем оно мне... Кинуть на главную с сообщением, что доступа нет, и всё. А через routes навесить посредников и будет всё красиво)
Но за всю информацию благодарю) Лишним не будет в этом деле.