如何将控制器中的 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 存储在会话数据中的啥位置?
从 4.1 升级到 4.2 后 Laravel 控制器路由中断