中间件中设置的变量在资源控制器的构造函数中为空,但在控制器的其他方法中具有值(非空)

时间:2018-05-03 07:38:24

标签: laravel laravel-5.3 laravel-5.4 laravel-5.5 laravel-5.6

我正在为我的资源控制器使用中间件,在中间件中我设置了一些全局变量。现在我想在我的控制器的构造函数中访问这些变量,但是当我尝试在构造函数中访问这些变量时,我得到null值,而如果我在该控制器的任何其他方法中访问它们,我将收到非null值。我正在使用Laravel 5.6。以下是它的代码。

控制器:

class PhaseController extends ApiController
{
    public function __construct(Request $request)
    {
       parent::__construct();
       $this->middleware('myMiddleware');
       $myVar = $request->myVar;
    }
 }

中间件:

class myMiddleware
{
/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
 public function handle($request, Closure $next)
 {
    $explodedPath = explode("/",$request->path());
    $request["myVar1"] = $explodedPath[5];
    //Code here
    return $next($request);
  }
}

这是因为在调用中间件之前接收到请求对象,所以即使我在中间件中修改请求对象,Constructor仍然使用旧的请求对象状态。在这里,我需要刷新请求对象以获取其新状态。但我不知道怎么做。

提前致谢。

1 个答案:

答案 0 :(得分:0)

尝试将其添加到请求ParameterBag:

public function handle($request, Closure $next)
{
    $parts = explode('/', $request->path()); 
    $request->attributes->add(['myVar1' => data_get($parts, 5)]);

    // Code here

    return $next($request);
}

然后在你的控制器中:

$myVar = $request->get('myVar1');

编辑:

如果您需要控制器中的路径参数,为什么不使用

$request->route()->parameters();

$request->route('parameter_name'); // where name is based on the name in your route definition.