2015-02-24 61 views
3

从中间件获取当前路由操作名字我有这样的一个中间件:在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)执行之前做一些权限操作之前运行。我怎样才能做到这一点 ?

回答

7

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

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

的路由器已经运行之前你可以在中间件的URI串 - 并做一些逻辑那里,如果你喜欢:$request->segments()。即通过这种方式可以查看URI段是否与特定路由匹配并运行某些代码。

编辑:

一种方式我可以很快想到的是只是包装的所有路由组中这样的:

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

我需要'actionName'因为我把它传递给Doctine SimpleAnnotationReader来获得一些注释,所以'$ request-> segments()'不会帮助我。有没有其他方法可以在所有请求中执行我的中间件来检查权限。 – 2015-02-24 14:58:27

+1

有一种方法 - 请参阅我编辑的答案。在路由器启动的时候可能会有一种手动调用中间件对象的方法 - 但我不能把它当作这个阶段来考虑 - 明天我会玩弄它 – Laurence 2015-02-24 15:21:20

0

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

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