symfony2:在呈现的控制器中访问 c​​ookie

symfony2: access cookie in rendered controller

我正在使用 symfony2,我的 cookie 出现了奇怪的行为。这是过程: 1-我呈现一个经典的形式,没有什么棘手的-> OK 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')) 行 return true 这次!!

我错过了什么?

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

Once the cookies have been set, they can be accessed on the next page load with the $_COOKIE array. Cookie values may also exist in $_REQUEST.

所以,我相信您的 cookie 会在下次请求时出现。我对吗?

正如@Jovan Perovic 所说,当您在提交表单后第一次查看页面时,您实际上并没有 cookie,因为您刚刚收到它和响应。

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

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

文档中也推荐:

Redirecting a user after a successful form submission prevents the user from being able to hit the "Refresh" button of their browser and re-post the data.