2013-06-20 47 views
5
Symfony2的PDO會議

我使用的Symfony 2.3.1(這個問題也存在於2.2)與session.handler.pdo,但是當我添加Flash袋消息,像這樣:與Flashbag

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

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

它不顯示在重定向後的主頁上,直到我按刷新,然後顯示出來。所以它需要顯示2個請求。如果我將會話存儲更改回原生,則此問題已消失。任何想法爲什麼發生這種情況?

我用下面的打印信息的枝條

{% 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%] 

回答

0

試圖改變get('session')getSession()。希望它能起作用。

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; 
} 
1

我在使用swiftmailer時遇到了同樣的問題,並且我得到了這個問題的quickfix。

如果您在此操作中使用SwiftMailer,請嘗試刪除配置文件中的假脫機行。

這不是最好的解決方法,但它的工作原理。

仍然在努力和思考在這裏一個更好的解決方案...