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

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个回答

8
如果路由尚未被分派,您将无法获取路由操作名称。路由器类尚未完成其工作 - 因此您不能执行$router->request() - 它将为null。
如果以$routeMiddleware方式运行路由中间件,则可以直接执行$router->request()
您可以在路由器运行之前的中间件中获取URI字符串,并在那里进行一些逻辑:$request->segments()。也就是说,您可以查看URI段是否与特定路由匹配并运行某些代码。
编辑:
我能想到的一种快速方法就是像这样将所有路由包装在一个组中:
$router->group(['middleware' => 'permissionsHandler'], function() use ($router) {
            // Have every single route here
});

我需要 actionName,因为我将其传递给Doctrine SimpleAnnotationReader以获取一些注释,所以 $request->segments() 对我没有帮助。是否有其他方法可以在所有请求中执行我的中间件以检查权限? - Mohamed Nagy
1
有一种方法 - 请查看我的编辑答案。也许有一种方法可以在路由器启动时手动调用中间件对象 - 但是我现阶段想不出来 - 我明天会试着解决它。 - Laurence

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

0

这也是可以的。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接