使用Flashbag进行Symfony2 PDO会话

时间:2013-06-20 20:01:14

标签: php session symfony

我正在使用Symfony 2.3.1(这个问题也出现在2.2中)和session.handler.pdo,但是当我添加一个flash包消息时:

$this->get('session')->getFlashBag()->add(
     'success', "Your message has been sent."
);                

return $this->redirect($this->generateUrl('home'));

重定向后主页上没有显示,直到我按下刷新,然后显示。因此它会显示2个请求。如果我将会话存储更改回本机,则问题就消失了。任何想法为什么会发生这种情况?

我使用以下内容在Twig中打印消息

{% for flashMessage in app.session.flashbag.get('success') %}
     {{flashMessage}}
{% endfor %} 

我的服务与以下文档相同:

services:
    pdo:
        class: PDO
        arguments:
            dsn:      "mysql:dbname=%database_name%"
            user:     %database_user%
            password: %database_password%
        calls:
            - [setAttribute, [3, 2]] # \PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION

    session.handler.pdo:
        class:     Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler
        arguments: ["@pdo", %pdo.db_options%]

3 个答案:

答案 0 :(得分:1)

我在memcache会话中有类似的东西。可能存在竞争条件。

当写入flash和重定向序列时可以:

-client redirects    | -DB saves record
-client accesses     |
 the redirected URL  |
                     | -DB completes saving
-client refreshes    |

在我的情况下,解决方法是在AppKernel.php下面添加。

public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
{
    $response = parent::handle($request, $type, $catch);

    if ($type == HttpKernelInterface::MASTER_REQUEST) {
        if ($this->getContainer()->get('session')->isStarted()) {
            //explicitly save session before returning $response
            $this->getContainer()->get('session')->save();
        }
    }

    return $response;
}

答案 1 :(得分:1)

使用swiftmailer时遇到同样的问题,我得到了一个针对此问题的快速修复程序。

如果您在此操作中使用SwiftMailer,请尝试删除配置文件中的假脱机行。

这不是修复它的最佳方法,但它确实有效。

仍然在这里工作并思考更好的解决方案......

答案 2 :(得分:0)

尝试使用get('session')更改getSession()。希望它能起作用。