如何将控制器中的 Laravel 4.2 beforeFilter 转换为 Laravel 5.2 中的自定义中间件

Posted

技术标签:

【中文标题】如何将控制器中的 Laravel 4.2 beforeFilter 转换为 Laravel 5.2 中的自定义中间件【英文标题】:How do I convert Laravel 4.2 beforeFilter in controller into custom middleware in Laravel 5.2 【发布时间】:2019-08-27 19:38:02 【问题描述】:

我正在将我继承的 Laravel 4.2 应用程序升级到 Laravel 5.2。该应用程序为登录用户提供了多个角色,这些角色由之前的过滤器处理。每个控制器都有一系列功能和这些功能所允许的角色:

public $actionFilter = [
    'directories-create'=>['super','tsr'],
    'directories-destroy'=>['super','tsr'],
    'directories-edit'=>['super','tsr'],
    'directories-directoryinfo'=>['super','tsr','admin'],
    'directories-index'=>['super','tsr'],
    'directories-store'=>['super','tsr'],
    'directories-update'=>['super','tsr'],
];

然后在构造函数中调用Controller.php中的两个beforeFilters

public function __construct()

    $this->beforeFilter('@filterAuthorization');
    $this->beforeFilter('@rerouteSite');

Controller.php 有一个公共函数 filterAuthorization 检查用户的角色是否有权访问路由,还有一个公共函数 rerouteSite 允许用户停留在同一页面但在帐户之间切换(例如,支持代表)。

我花了相当多的时间阅读手册、谷歌搜索和阅读各种教程,但我仍然不清楚如何将我的路由角色数组连接到身份验证中间件。 Laravel 文档提供语法但不提供上下文,我读过的示例要么采用不同的方法,要么与我的用例不同。

我尝试将过滤器函数留在 Controller.php 中,并在构造中像这样调用它们:

public function __construct()

    $this->middleware('@filterAuthorization');
    $this->middleware('@rerouteSite');

我收到一条错误消息:“@filterAuthorization 类不存在”

我尝试将这些函数放在 app\Http\Middleware\Authenticate 中,但我收到相同的错误消息:“Class @filterAuthorization 不存在”

我按照 Matt Stauffer 的博客 (https://mattstauffer.com/blog/laravel-5.0-middleware-filter-style/) 和 (https://mattstauffer.com/blog/passing-parameters-to-middleware-in-laravel-5.1/) 以及 Nwanze Franklin 的帖子 (https://dev.to/franko4don/deep-dive-into-middlewares-in-laravel-doo) 上的步骤操作如下。

使用 Artisan 创建两个新的中间件文件

php artisan make:middleware FilterAuthorization
php artisan make:middleware RerouteSite

使用旧 Controller.php 中的函数编辑新的中间件文件

在 App\Http\Kernel 中注册新的中间件

protected $routeMiddleware = [
    'filterauth' => \Illuminate\Routing\Middleware\FilterAuthorization::class,
    'reroutesite' => \Illuminate\Routing\Middleware\RerouteSite::class,
];

在需要过滤的控制器中编辑公共函数__contstruct()

public function __construct()

    $this->middleware('FilterAuthorization');
    $this->middleware('RerouteSite');

运行

composer dump-autoload
php artisan clear-compiled
php artisan optimize

我仍然得到同样的错误: 类 FilterAuthorization 不存在

我确信有一种简单的方法可以将它们组合在一起,而无需重写整个角色授权系统。有人能指出我正确的方向吗?

【问题讨论】:

【参考方案1】:

内核注册需要引用正确的文件位置如下:

    'filterauth' => \App\Http\Middleware\FilterAuthorization::class,
    'reroutesite' => \App\Http\Middleware\RerouteSite::class,

并且控制器引导应该使用别名而不是类名:

public function __construct()

    $this->middleware('filterauth');
    $this->middleware('reroutesite');

然后 Laravel 可以找到自定义的中间件。

【讨论】:

以上是关于如何将控制器中的 Laravel 4.2 beforeFilter 转换为 Laravel 5.2 中的自定义中间件的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 4.2 将用户 ID 存储在会话数据中的啥位置?

Laravel 4.2 将变量传递给主布局

从 4.1 升级到 4.2 后 Laravel 控制器路由中断

Laravel 4.2 雄辩的动态查询

PHP Laravel 4.2 ajax post返回null或空

Laravel 4.2 jquery 对象到控制器