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

Pass complex parameter to route middleware

有什么方法可以将复杂参数(例如对象数组)传递给 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 参数,并且该数组对于不同的路由是不同的,因此通过全局上下文是行不通的。

我建议你在中间件中评估你的参数

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

虽然我仍然不确定你应该从哪里设置这个参数,如果你想从你的路由文件中传递它,你可以尝试使用

分组:

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

.. 或者,每条路线单独:

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

现在,使用此解决方法,modifiers 的数组将在路由的 action 上传递,也可以在中间件上下文中访问:

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

我不确定此解决方法是否适用于您当前的情况,但它可以为您指明正确的方向。