2013-06-20 30 views
5

Tôi đang sử dụng Symfony 2.3.1 (vấn đề này cũng đã có mặt trong 2.2) với session.handler.pdo, nhưng khi tôi thêm một thông điệp túi đèn flash như vậy:Symfony2 PDO phiên với Flashbag

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

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

Nó không hiển thị trên trang chủ sau khi chuyển hướng cho đến khi tôi nhấn làm mới, sau đó nó xuất hiện. Vì vậy, nó lấy 2 yêu cầu được hiển thị. Nếu tôi thay đổi bộ nhớ phiên trở về nguồn gốc thì vấn đề này đã biến mất. Có ý kiến ​​giải thích tại sao điều này lại xảy ra không?

tôi sử dụng những điều sau đây để in các thông điệp trong Twig

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

và dịch vụ của tôi cũng giống như các tài liệu hướng dẫn như sau:

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

Trả lời

0

cố gắng thay đổi get('session') với getSession(). Hy vọng nó sẽ hoạt động.

1

Tôi đã có phiên tương tự trong phiên memcache. Có thể có điều kiện chủng tộc.

Khi write flash và chuyển hướng trình tự có thể là:

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

Trong trường hợp workaround của tôi đã được thêm vào bên dưới 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

Tôi gặp vấn đề tương tự khi sử dụng swiftmailer và tôi gặp vấn đề về vấn đề này.

Nếu bạn đang sử dụng SwiftMailer trong hành động này, hãy thử loại bỏ đường ống chỉ trong tệp cấu hình của bạn.

Đó không phải là cách tốt nhất để khắc phục, nhưng nó hoạt động.

Vẫn đang làm việc và suy nghĩ trong một giải pháp tốt hơn ở đây ...