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

How do I convert Laravel 4.2 beforeFilter in controller into custom middleware in Laravel 5.2

我正在将我继承的 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 有一个 public 函数 filterAuthorization 检查用户的角色是否可以访问路由,还有一个 public 函数 rerouteSite 允许用户停留在同一页面但切换帐户之间(例如,对于支持代表)。

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

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

public function __construct()
{
    $this->middleware('@filterAuthorization');
    $this->middleware('@rerouteSite');
}

我收到一条错误消息:"Class @filterAuthorization does not exist"

我尝试将这些函数放在 app\Http\Middleware\Authenticate 中,但我收到相同的错误消息:"Class @filterAuthorization does not exist"

我按照 Matt Stauffer 博客 (https://mattstauffer.com/blog/laravel-5.0-middleware-filter-style/) and here (https://mattstauffer.com/blog/passing-parameters-to-middleware-in-laravel-5.1/) and on Nwanze Franklin's post here (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,
];

在控制器中编辑 public 函数 __contstruct() 而不是需要过滤

public function __construct()
{
    $this->middleware('FilterAuthorization');
    $this->middleware('RerouteSite');
}

运行

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

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

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

内核注册需要参考正确的文件位置,如下所示:

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

并且控制器启动应该使用别名而不是 class 名称:

public function __construct()
{
    $this->middleware('filterauth');
    $this->middleware('reroutesite');
}

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