5

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

$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%]
4

3 回答 3

1

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

当写闪存和重定向序列可以是:

-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;
}
于 2014-01-24T06:53:12.187 回答
1

我在使用 swiftmailer 时遇到了同样的问题,我得到了一个快速修复这个问题的方法。

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

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

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

于 2014-02-24T16:51:33.613 回答
0

尝试改变get('session')getSession()希望它会奏效。

于 2013-09-10T06:29:16.010 回答