【问题标题】:Laravel 5 - Assign Middleware to Controller NamespaceLaravel 5 - 将中间件分配给控制器命名空间
【发布时间】:2015-04-28 05:02:33
【问题描述】:

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

最初的想法是为管理员路由分配一个中间件,但这并不妨碍任何其他非管理员路由访问控制器。这意味着路由仍然可以针对管理控制器并绕过 ACL 检查。

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

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

【问题讨论】:

    标签: laravel laravel-5 laravel-middleware


    【解决方案1】:

    这让我们回到了这个问题:中间件可以分配给像 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');
    });
    

    【讨论】:

    • 这是我目前的结论。不过,我仍然希望找到一种针对多个控制器的方法(有或没有中间件)。这回答了我的问题,但并没有真正解决它。为 IoC 参考 +1,因为我还没有研究过。
    • 在很久以后重新访问之后,我发现使用基本控制器对组织可重用的控制器代码有很多好处(尤其是与会话和 ACL 相关的代码)。我什至在与原始项目不同的项目中走这条路,所以我将此作为公认的答案。
    【解决方案2】:

    编辑

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

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

    【讨论】:

      猜你喜欢
      • 2018-10-22
      • 2015-04-12
      • 2015-07-05
      • 2023-04-09
      • 2016-03-21
      • 2019-06-14
      • 2015-05-13
      • 2016-03-14
      • 1970-01-01
      相关资源
      最近更新 更多