Symfony - $ request-> getSession()= null

时间:2017-08-09 16:05:28

标签: php symfony session request

从那天起,我们从谷歌的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;
    }
...
}

有什么想法吗?

2 个答案:

答案 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以控制要抓取的网址