我正在尝试从路由发送变量以终止中间件:
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
}
答案 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键,并在我的终止函数中重用相同的键。