Laravel 5 - 将中间件分配给控制器命名空间
Laravel 5 - Assign Middleware to Controller Namespace
在允许访问 Laravel 5 网站的管理面板之前,我需要对用户进行 ACL 检查。对命名空间 App\Http\Controllers\Admin\*
中的整个控制器组执行此操作的最佳方法是什么?最终,我正在寻找一种 "set and forget" 方法来执行此操作,而中间件看起来是目前为止最好的选择。
最初的想法是为管理路由分配一个中间件,但这并不能阻止任何其他非管理路由访问控制器。这意味着路由仍然可以以管理控制器为目标并绕过 ACL 检查。
下一个想法是在控制器的构造函数中插入赋值,但这需要每个额外的控制器显式包含中间件。这将要求开发人员知道应该包含中间件,这让他们完全错过了它。这也适用于使用一个基本控制器作为所有管理控制器的父级,因为开发人员需要知道应该扩展基本控制器。现在,这看起来是最好的解决方案。
这让我们回到了问题:可以将中间件分配给像 App\Http\Controllers\Admin\*
这样的控制器通配符命名空间吗?或者,是否有更好的方法让 ACL 检查永远不需要显式分配给每个管理控制器?
This leads us back to the question: can middleware be assigned to a controller wildcard namespace like 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');
});
编辑
我之前的回答并不适用于所有情况;它打破了很多其他路线。这是我最终做的事情(在 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');
...
});
这至少在我定义路由时针对所有管理控制器。这并不是我所希望的一切,但它会做到的。
在允许访问 Laravel 5 网站的管理面板之前,我需要对用户进行 ACL 检查。对命名空间 App\Http\Controllers\Admin\*
中的整个控制器组执行此操作的最佳方法是什么?最终,我正在寻找一种 "set and forget" 方法来执行此操作,而中间件看起来是目前为止最好的选择。
最初的想法是为管理路由分配一个中间件,但这并不能阻止任何其他非管理路由访问控制器。这意味着路由仍然可以以管理控制器为目标并绕过 ACL 检查。
下一个想法是在控制器的构造函数中插入赋值,但这需要每个额外的控制器显式包含中间件。这将要求开发人员知道应该包含中间件,这让他们完全错过了它。这也适用于使用一个基本控制器作为所有管理控制器的父级,因为开发人员需要知道应该扩展基本控制器。现在,这看起来是最好的解决方案。
这让我们回到了问题:可以将中间件分配给像 App\Http\Controllers\Admin\*
这样的控制器通配符命名空间吗?或者,是否有更好的方法让 ACL 检查永远不需要显式分配给每个管理控制器?
This leads us back to the question: can middleware be assigned to a controller wildcard namespace like 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');
});
编辑
我之前的回答并不适用于所有情况;它打破了很多其他路线。这是我最终做的事情(在 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');
...
});
这至少在我定义路由时针对所有管理控制器。这并不是我所希望的一切,但它会做到的。