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

时间:2015-02-24 14:39:07

标签: 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);
    }

}

$request->route()始终返回null,我认为是因为路由器尚未根据请求进行调度。

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

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

我希望在执行$next($request)之前获取路由操作名称以执行某些权限操作。我怎么能这样做?

3 个答案:

答案 0 :(得分:7)

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

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

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

编辑:

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

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

答案 1 :(得分:1)

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

...
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();
    }
}

答案 2 :(得分:0)

这也很好。

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