symfony2:在呈现的控制器

时间:2015-08-28 17:21:08

标签: symfony cookies render

我正在使用symfony2,而且我的cookie遇到了奇怪的行为。这是一个过程: 1-我渲染一个经典形式,没有什么棘手的 - >好 2-我验证了表格,我设置了一个cookie来记住表格没问题

public function indexAction(Request $request)
{      
    [...]
    if ($form->isValid()) {     
         [...]
         $cookie = new Cookie('cookietest', 'rdvalue', time()+3600 * 24 * 365, '/', null, false, false);
         $response = new Response();
         $response->headers->setCookie($cookie);
         $response->prepare($request);            
         $response->send();

         $formSuccess = true;
    }

    return array('form' => $form->createView(), 'formSuccess' => $formSuccess);
}

在这一点上,一切似乎都很完美。在我的渲染索引模板中,我有一个渲染控制器如下:

index.html.twig:

{% if  formSuccess %}
    {{ render(controller('MyBundle:Demo:checkCookie')) }}              
{% endif %}

并在我的checkCookie操作中:

public function checkCookieAction(Request $request){
     [...]  
     if($request->cookies->has('cookietest')) <-- return false. If i dump it, i don't see the cookietest cookie
     [...]
}

我应该能够看到cookie,因为我在之前的控制器中设置了它,这是一个呈现index.html.twig页面的控制器。

更奇怪的是,如果我只是刷新页面,这次if($request->cookies->has('cookietest'))行返回 true !!

我错过了什么?

2 个答案:

答案 0 :(得分:1)

如果我没错,这就是它的工作方式。官方PHP的文档说明了这一点:

  

设置完cookie后,可以在下一页加载$ _COOKIE数组时访问它们。 Cookie值也可能存在于$ _REQUEST。

因此,我相信您的Cookie会在下一个请求中显示。我对吗?

答案 1 :(得分:1)

正如@Jovan Perovic所说,当你在表单提交后第一次看到一个页面时,你实际上没有cookie,因为你刚收到回复。

解决方案是在验证表单后重定向:

if ($form->isValid()) {
... 
    $this->redirect($this->generateUrl('actual_route'));
}

它也在文档中推荐:

  

在成功提交表单后重定向用户可防止用户点击&#34;刷新&#34;浏览器按钮并重新发布数据。