Laravel 5 — Назначение промежуточного программного обеспечения пространству имен контроллера

Мне нужно выполнить проверку ACL для пользователя, прежде чем разрешить доступ к панели администратора веб-сайта Laravel 5. Как лучше всего это сделать для всей группы контроллеров в пространстве имен App\Http\Controllers\Admin\*? В конечном счете, я ищу для этого метод «установил и забыл», и промежуточное ПО выглядит пока лучшим вариантом.

Первоначальная идея состояла в том, чтобы назначить промежуточное ПО для маршрута администратора, но это не препятствует доступу к контроллерам любым другим маршрутам, не являющимся администраторами. Это означает, что маршрут может по-прежнему ориентироваться на контроллеры администратора и обходить проверку ACL.

Следующей идеей было вставить присваивание в конструктор контроллеров, но для этого потребовалось бы, чтобы каждый дополнительный контроллер явно включал промежуточное ПО. Для этого разработчик должен знать, что промежуточное ПО должно быть включено, что позволяет ему полностью его пропустить. Это также относится к использованию одного базового контроллера в качестве родительского для всех контроллеров администратора, поскольку разработчику необходимо знать, что базовый контроллер должен быть расширен. На данный момент это выглядит как лучшее решение.

Это возвращает нас к вопросу: может ли промежуточное ПО быть назначено пространству имен с подстановочными знаками контроллера, например App\Http\Controllers\Admin\*? Или есть лучший способ, чтобы проверку ACL никогда не приходилось явно назначать каждому контроллеру администратора?


person Siphon    schedule 25.02.2015    source источник


Ответы (2)


Это возвращает нас к вопросу: может ли промежуточное ПО быть назначено пространству имен с подстановочными знаками, например App\Http\Controllers\Admin*?

No

Самый простой подход, который вы можете сделать, это создать базовый контроллер, такой как App\Http\Controllers\Admin\Controller, и включить промежуточное ПО, в то время как все остальные App\Http\Controllers\Admin\* расширят его.

В качестве альтернативы, все еще добавляя App\Http\Controllers\Admin\Controller, вы можете вместо этого внедрить промежуточное ПО через контейнер IoC.

App::afterResolving('App\Http\Controllers\Admin\Controller', function ($controller) {
    $controller->middleware('acl');
});
person crynobone    schedule 26.02.2015
comment
Это был мой вывод до сих пор. Тем не менее, я все еще надеюсь найти способ настроить таргетинг на несколько контроллеров (с промежуточным программным обеспечением или без него). Это отвечает на мой вопрос, но на самом деле не решает его. +1 за ссылку на IoC, так как я еще не изучал это. - person Siphon; 26.02.2015
comment
Вернувшись к этому намного позже, я обнаружил, что использование базового контроллера имеет много преимуществ для организации многократно используемого кода контроллера (особенно в отношении сеансов и ACL). Я даже пошел по этому пути в другом проекте, чем в оригинале, поэтому я делаю это принятым ответом. - person Siphon; 14.11.2017

ИЗМЕНИТЬ

Мой предыдущий ответ не совсем подходит для всех ситуаций; это сломало много других маршрутов. Вот что я сделал вместо этого (в app/Http/routes.php):

Route::group(['namespace' => 'Admin', 'prefix' => 'admin', 'middleware' => 'App\Http\Middleware\Acl'], function()
{
  Route::get('/', 'AdminController@index');
  Route::get('/user', 'User\UserController@index');
  ...
});

По крайней мере, это нацелено на все контроллеры администратора, когда я определяю маршрут. Это не совсем все, на что я надеялся, но сойдет.

person Siphon    schedule 21.03.2015