将复杂参数传递给路由中间件

问题描述:

有没有办法将复杂参数(例如对象数组)传递给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我已经添加了示例代码 –

里面虽然我仍然在这里您将设置该参数不知道,如果你想通过从你的路由文件,通过它,你可以尝试的东西要么

分组:

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

谢谢,这就是我一直在寻找的! –

我建议您评估您的参数中间件

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

那么,怎么样?这仍然不能解决我的问题 - 将复杂的参数传递给中间件。如果这是不可能的 - 那么很好,我会找到一些更好或更糟的解决方法,像你的。哦,如果这是不可能的,那么请更新您的答案与该信息,因为现在它不是一个问题的答案'如何传递参数而不是字符串中间件?',我会接受并投票它的一些一种有效的解决方法:) –