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

Get current route action name from middleware in 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);
    }

}

但是 $request->route() 总是 returns null,我认为这是因为路由器没有随请求一起发送。

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

protected $middleware = [
        .
        .
        .
        'App\Http\Middleware\PermissionsHanlderMiddleware',
    ];

我想在执行$next($request)之前获取路由动作名称来做一些权限操作。我该怎么做?

如果路由器尚未被调度,则无法获取路由操作名称。路由器 class 还没有完成它的工作 - 所以你不能做 $router->request() - 它只是空的。

如果它 运行s as routeMiddleware as $routeMiddleware - 那么你可以做 $router->request()

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

编辑:

我很快想到的一种方法就是将所有路线包装在一个组中,如下所示:

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

这是我在项目中做的解决方案:

...
public function handle($request, Closure $next) {
    DB::beginTransaction();
    $nextRequest = $next($request); //The router will be dispatched here, but it will reach to controller's method sometimes, so that we have to use DB transaction.
    $routeName = $request->route()->getRouteName();
    if ($checkPassed) {
        DB::commit();
        return $nextRequest;
    } else {
        DB::rollback();
    }
}

这个也可以

$request->path(); // path
$request->route()->getName()//name of the route