2015-02-24 64 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(); 
    } 
}