从那天起,我们从谷歌的IP中获得了一个php错误:
[client 66.249.xx.xx:xxxx] Got error 'PHP message: PHP Fatal error: Uncaught Symfony\\Component\\Debug\\Exception\\FatalThrowableError: Call to a member function get() on null in /usr/home/project/myProject/src/AppBundle/Service/LocaleListener.php:22
似乎Symfony的$request->getSession()
有时会返回null。无法弄清楚原因。这是发生错误的地方:
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
if (!empty($request->getSession()->get('_locale'))) {
return;
}
...
}
有什么想法吗?
答案 0 :(得分:0)
您将没有所有请求的会话。例如,它来自CLI。此外,除非由于某种原因它是以这种方式设计的,否则“传统”API请求也不会。
答案 1 :(得分:0)
使用symfony定义防火墙,默认情况下,用户仅在一个防火墙下进行身份验证。
例如security.yml
:
firewalls:
secondfirewall:
pattern: ^/secondfirewall
provider: broker
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
logout: true
anonymous: true
我认为您的用户是在主防火墙
下记录的您将在所有网址上开设会话,但 / secondfirewall 开头除外。这可以解释为什么你没有参加会议
要调试哪条路由出错,您可以将日志添加到您的侦听器,如果没有可用的会话则退出。
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
if(null === $request->getSession()) {
// Log everything you want to debug, url, paremeters, body content etc
// Then you can redirect the user to the login page
return new RedirectResponse('someloginurl');
// Or you can just exit from your listener
return;
}
if (!empty($request->getSession()->get('_locale'))) {
return;
}
...
}
如果您在评论中提到,出现错误的电话是Google的机器人电话,您可以登录:
$request->headers->get('User-Agent') -> check the returned string,
使用preg_match的正则表达式,如果与Google用户代理匹配,则退出侦听器。
此外,你可以配置谷歌机器人将使用robot.txt文件解析的页面,请检查google documentation以控制要抓取的网址