Laravel 5 - 将中间件分配给控制器命名空间

时间:2015-02-25 23:44:31

标签: laravel laravel-5 laravel-middleware

在允许访问Laravel 5网站的管理面板之前,我需要为用户进行ACL检查。对命名空间App\Http\Controllers\Admin\*中的整个控制器组执行此操作的最佳方法是什么?最终,我正在寻找一种“一劳永逸”的方法来实现这一目标,而中间件看起来是迄今为止最好的选择。

最初的想法是将中间件分配给管理路由,但这不会阻止任何其他非管理员路由访问控制器。这意味着路由仍然可以定位管理控制器并绕过ACL检查。

下一个想法是在控制器的构造函数中插入赋值,但这需要每个额外的控制器明确包含中间件。这将要求开发人员知道应该包含中间件,这允许他们完全错过它。这也适用于使用一个基本控制器作为所有管理控制器的父控制器,因为开发人员需要知道应该扩展基本控制器。现在,这看起来是最好的解决方案。

这引出了我们的问题:可以将中间件分配给控制器通配符名称空间,如App\Http\Controllers\Admin\*吗?或者,是否有更好的方法可以将ACL检查永远不需要显式分配给每个管理控制器?

2 个答案:

答案 0 :(得分:3)

  

这引出了我们的问题:可以将中间件分配给控制器通配符命名空间,例如App \ Http \ Controllers \ Admin *?

没有

您可以做的最简单的方法是创建一个基本控制器,例如App\Http\Controllers\Admin\Controller并包含中间件 所有其他App\Http\Controllers\Admin\*扩展了它。

或者,在添加App\Http\Controllers\Admin\Controller的同时,您可以通过IoC Container注入中间件。

App::afterResolving('App\Http\Controllers\Admin\Controller', function ($controller) {
    $controller->middleware('acl');
});

答案 1 :(得分:1)

修改

我之前的回答并不适用于所有情况;它打破了很多其他路线。这是我最终做的事情(在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');
  ...
});

当我定义路由时,这至少会针对所有管理员控制器。它并不是我所希望的一切,但它会做到。