我正在尝试从路由发送一个变量来终止中间件:
Route::group(['middleware' => 'checkUserLevel'], function () {
// my routes
});
我可以在中间件句柄中获取checkUserLevel
,但我也需要在terminate方法中访问,我该怎么办?
public function handle($request, Closure $next, $key)
{
dd($key); // it returns variable
}
public function terminate($request, $response)
{
//I need that variable here
}
发布于 2019-06-08 10:40:08
正如在documentation中提到的,如果您希望使用相同的中间件实例(因为在默认情况下,它使用的是中间件的新实例),则需要将中间件注册为单例。
您可以通过添加到ServiceProvider
的register
方法将其注册为单例
public function register()
{
$this->app->singleton(\App\Http\Middleware\YourMiddleware::class);
}
然后,您可以像lorent's answer的第一个示例一样使用类的属性
protected $foo;
public function handle($request, Closure $next)
{
$this->foo = 'bar';
return $next($request);
}
public function terminate($request, $response)
{
// because we cannot use `dd` here, so the example is using `logger`
logger($this->foo);
}
发布于 2019-01-02 14:24:01
您可以执行以下操作:
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');
}
发布于 2020-07-10 19:48:39
我知道这很古老,但是你也可以使用静态属性。这使您不必注册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函数中生成一个缓存键,并在terminate函数中重用相同的键。
https://stackoverflow.com/questions/54001927
复制相似问题