2015-02-25 3 views
0

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

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

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

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

ответ

3

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

Нет

Самый простой подход вы можете сделать, это создать базовый контроллер, такой как 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'); 
}); 
+0

Это был мой вывод. Я все еще надеюсь на способ нацеливания на несколько контроллеров, хотя (с или без промежуточного программного обеспечения). Это отвечает на мой вопрос, но на самом деле это не решает. +1 для справки IoC, поскольку это не то, что я изучил. – Siphon

+0

После пересмотра этого намного позже я обнаружил, что использование базового контроллера имеет много преимуществ для организации кода повторного использования контроллера (особенно для сеансов и ACL). Я даже пошел этот маршрут в другом проекте, чем в оригинале, поэтому я принимаю это принятый ответ. – Siphon

0

EDIT

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

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

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