2016-12-03 99 views
0

有沒有辦法將複雜參數(例如對象數組)傳遞給laravel中的中間件?我知道我可以通過某種DSL傳遞字符串,但我需要將一些更復雜的數據傳遞給其中一箇中間件。這是可以實現的嗎?如果是這樣,怎麼樣?將複雜參數傳遞給路由中間件

有例子就是我想達到

class Middleware 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next, array $modifiers = null) 
    { 
     foreach($modifiers as $name => $closure) { 
      $request->$name = $closure($request->name) 
     } 
     return $next($request); 
    } 
} 

而且我想通過

[ 
    'param' => function($param) { return $param * 2; } 
] 

至於$modifiers參數中間件,以及陣列將是不同的路線通過全球化,所以通過不同情境是不行的。

+0

你能提供一個你正試圖實現的例子嗎? – Wistar

+0

這個變量從哪裏來?請分享一些代碼和工作流程。 –

+0

@Wistar我已經添加了示例代碼 –

回答

1

裏面雖然我仍然在這裏您將設置該參數不知道,如果你想通過從你的路由文件,通過它,你可以嘗試的東西要麼

分組:

Route::group(['middleware' => 'somemiddleware'], function() { 
    Route::group(['modifiers' => [ 
    function() { return '1'; }, 
    function() { return '2'; } 
    ]], function() { 
    Route::get('/foo', function() { 
     echo 'bar..'; 
    }); 
    // some other routes here 
    }); 

..或,單獨爲每個路線:

class Middleware 
{ 
    public function handle($request, Closure $next) 
    { 
    foreach($this->getModifiers($request) as $name => $closure) { 
     $request->$name = $closure($request->name); 
    } 
    return $next($request); 
    } 
    protected function getModifiers($request) { 
    $routeAction = $request->route()->getAction(); 

    return isset($routeAction['modifiers']) ? $routeAction['modifiers'] : array(); 
    } 
} 

Route::group(['middleware' => 'somemiddleware'], function() {  
    Route::get('/foo', ['modifiers' => [ 
     function() { return '1'; }, 
     function() { return '2'; } 
    ], 'uses' => function() { 
     echo 'foo..'; 
    }]); 
}); 

現在,使用此解決方案,的modifiers陣列將所述路線的action,其也可以在中間件上下文中訪問被傳遞

我不確定這種解決方法是否適用於您當前的情況,但它可能會使您處於正確的方向。

+0

謝謝,這就是我一直在尋找的! –

0

我建議您評估您的參數中間件

class Middleware 
{ 

    public function handle($request, Closure $next) 
    { 
     $modifiers = $this->getModifiers(); 
     foreach($modifiers as $name => $closure) { 
      $request->$name = $closure($request->name) 
     } 
     return $next($request); 
    } 

    protected function getModifiers(){ 

     //Logic you need to get to your param 

     return $param; 
    } 
} 
+0

嗯,這不是我要找的。我知道我可以從任何上下文(包括中間件)訪問全局變量(配置變量只是奇特的全局變量),但這不是解決問題的辦法,只是奇怪的解決方法。爲什麼不?我可以將參數傳遞給例如油門中間件,或者可以使用中間件,這非常好。我想用我的中間件做同樣的事情,但不是像'60'那樣傳遞字符串來扼制我想要傳遞數組像'[1,2,function(){...}]到中間件。全局變量不能解決任何問題。 –

+0

@ Kacper'Kadet'Donat而不是傳遞一個變量,你有沒有想過給你的中間件添加一個受保護的函數,它會做邏輯來確定節流閥的數量? – Wistar

+0

那麼,怎麼樣?這仍然不能解決我的問題 - 將複雜的參數傳遞給中間件。如果這是不可能的 - 那麼很好,我會找到一些更好或更糟的解決方法,像你的。哦,如果這是不可能的,那麼請更新您的答案與該信息,因爲現在它不是一個問題的答案'如何傳遞參數而不是字符串中間件?',我會接受並投票它的一些一種有效的解決方法:) –