在我的应用程序上,我向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
我该如何解决?
答案 0 :(得分:0)
首先,我同意该代码应该在中间件中,而不是在RouteServiceProvider中。
如果您仅在这里使用该语言,我建议您仅使用app()->setLocale()
而不是将网站保存在您的请求中。如果您需要网站对象中包含的其他信息,我建议将其存储在会话中而不是在请求中存储,因为我认为这类信息比请求更受会话的责任,而该请求是设计来处理的输入,http动词,标题,...
这可以解决您的问题,如果不是这种情况,请让我们查看更多代码和新的dd()结果