发送变量以终止于中间件

时间:2019-01-02 06:04:49

标签: laravel middleware

我正在尝试从路由发送变量以终止中间件:

Route::group(['middleware' => 'checkUserLevel'], function () {
    // my routes
});

我可以使用中间件处理checkUserLevel,但我也需要通过终止方法进行访问,我该怎么办?

public function handle($request, Closure $next, $key)
{
     dd($key); // it returns variable
}

public function terminate($request, $response)
{
      //I need that variable here
}

3 个答案:

答案 0 :(得分:1)

您可以这样做:

protected $key;

public function handle($request, Closure $next, $key)
{
     $this->key = $key;
}

public function terminate($request, $response)
{
     $this->key; //access property key
}

即使应通过全局请求传递。喜欢:

public function handle($request, Closure $next)
{
     $request->input('key');
}

public function terminate($request, $response)
{
      $request->input('key');
}

编辑:

Route::group(['middleware' => 'checkUserLevel'], function () {
    Route::get('/test/{testparam}', function () {
    });
});

public function handle($request, Closure $next)
{
     $request->route('testparam');
}

public function terminate($request, $response)
{
      $request->route('testparam');
}

答案 1 :(得分:0)

documentation中所述,如果要使用相同的中间件实例(因为默认情况下它使用的是中间件的新实例),则需要将中间件注册为单例。

您可以通过添加到ServiceProvider的{​​{1}}方法中将其注册为单例

register

然后,您可以像lorent's answer的第一个示例那样使用类的属性

public function register()
{
    $this->app->singleton(\App\Http\Middleware\YourMiddleware::class);
}

答案 2 :(得分:0)

我知道这已经很老了,但是您也可以使用静态属性。这使您不必注册singleton

<?php

namespace App\Http\Middleware;

class MyMiddleware {
    private static $key;

    public function handle($request, Closure $next, $key)
    {
         self::$key = ($key); // it returns variable
    }

    public function terminate($request, $response)
    {
          $key = self::$key;
    }
}

这在我的Laravel 5.8应用程序中有效,看不出为什么在其他地方不起作用。无法说出是否有任何理由不这样做,但我不知道一个。

我自己使用它在我的handle函数中生成一个Cache键,并在我的终止函数中重用相同的键。