Laravel HTTP测试和请求属性

时间:2019-03-21 15:44:46

标签: laravel testing

在我的应用程序上,我向HTTP请求添加了属性,以便以后使用。我的应用是一个多域应用(.co.uk,.dk,.de)。我在RouteServiceProvider中找到域,并将检测到的语言添加到HTTP请求中,以便我可以根据语言和其他一些内容加载数据。 我找到并直接在RouteServiceProvider中添加网站:

$website = Website::where('domain', '=', request()->getHttpHost())->first();
request()->attributes->add(['website' => $website]);

然后在我的控制器中或其他任何地方,我只需要查询请求

if (!$request->attributes->has('website')) {
    \Log::error('Abort HTTP request: invalid website: ' . request()->getHttpHost());
    abort('500');
}
$language = $request->attributes->get('website')->language();

在测试我的应用程序时,代码可以正常执行(在RouteServiceProvider中找到该网站),但随后它在控制器中中断:

  

testing.ERROR:中止HTTP请求:无效的网站

当查看属性时,控制器中的数据为空,而RouteServiceProvider中的数据为空:

dump($request->attributes); // in RouteServiceProvider.php
Symfony\Component\HttpFoundation\ParameterBag {
    #parameters: array:1 [
        "website" => ...

dump($request->attributes); // in controller
Symfony\Component\HttpFoundation\ParameterBag {
  #parameters: []
}

看起来控制器中的请求对象不再相同。倾销时:

dump(['RouteServiceProvider' => request()]);

我得到: “ RouteServiceProvider” =>照亮\ Http \请求{# 385 并在控制器中:

dump(['Controller' => request()]);

“控制器” =>照亮\ Http \请求{# 9379

我该如何解决?

1 个答案:

答案 0 :(得分:0)

首先,我同意该代码应该在中间件中,而不是在RouteServiceProvider中。

如果您仅在这里使用该语言,我建议您仅使用app()->setLocale()而不是将网站保存在您的请求中。如果您需要网站对象中包含的其他信息,我建议将其存储在会话中而不是在请求中存储,因为我认为这类信息比请求更受会话的责任,而该请求是设计来处理的输入,http动词,标题,...

这可以解决您的问题,如果不是这种情况,请让我们查看更多代码和新的dd()结果