我正在升级我继承到Laravel 5.2的Laravel 4.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,它允许用户保持在同一页面上但在帐户之间切换(例如,支持代表)。
我花了相当多的时间阅读手册,谷歌搜索和阅读各种教程,但我仍然不清楚如何让我的路由角色阵列连接到auth中间件。 Laravel文档提供语法但不提供上下文,我读过的示例采用不同的方法或者与我的用法不同。
我尝试将过滤器函数留在Controller.php中并在构造中调用它们:
public function __construct()
{
$this->middleware('@filterAuthorization');
$this->middleware('@rerouteSite');
}
我收到一条错误消息:“类@filterAuthorization不存在”
我尝试将这些函数放在app \ Http \ Middleware \ Authenticate中,但我收到相同的错误消息:“类@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不存在
我确信有一种简单的方法可以将它放在一起,而无需重写整个角色授权系统。有人能指出我正确的方向吗?
内核注册需要引用正确的文件位置,如下所示:
'filterauth' => \App\Http\Middleware\FilterAuthorization::class,
'reroutesite' => \App\Http\Middleware\RerouteSite::class,
控制器启动应该使用别名而不是类名:
public function __construct()
{
$this->middleware('filterauth');
$this->middleware('reroutesite');
}
然后Laravel可以找到自定义中间件。