从laravel 5中的中间件获取当前路由操作名称

Moh*_*agy 4 laravel laravel-5

我有这样的中间件:

<?php
namespace App\Http\Middleware;

use App\Contracts\PermissionsHandlerInterface;
use Closure;

class PermissionsHanlderMiddleware {

    public $permissionsHandler;

    function __construct(PermissionsHandlerInterface $permissionsHandler) {
        $this -> permissionsHandler = $permissionsHandler;
    }

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next) {
        $routeAction = $request->route()->getActionName();

        /*
         do some operations
        */

        return $next($request);
    }

}
Run Code Online (Sandbox Code Playgroud)

$request->route()总是返回null,我认为是因为路由器尚未随请求一起调度.

注意:我将中间件添加到Kernal.php全局中间件,以便在每个请求之前运行,如下所示

protected $middleware = [
        .
        .
        .
        'App\Http\Middleware\PermissionsHanlderMiddleware',
    ];
Run Code Online (Sandbox Code Playgroud)

我想在执行$next($request)某些权限操作之前获取路由操作名称.我怎样才能做到这一点 ?

Lau*_*nce 7

如果尚未分派路由器,则无法获取路由操作名称.路由器类还没有完成它的东西 - 所以你做不到$router->request()- 它只是为空.

如果它作为routeMiddleware运行$routeMiddleware- 那么你可以这样做 $router->request()

你可以在路由器运行之前在中间件中获取URI字符串 - 如果你愿意,可以在那里做一些逻辑:$request->segments().也就是说,你可以看到URI段是否与特定路线匹配并运行一些代码.

编辑:

我可以快速想到的一种方法是将所有路由包装在这样的组中:

$router->group(['middleware' => 'permissionsHandler'], function() use ($router) {
            // Have every single route here
});
Run Code Online (Sandbox Code Playgroud)