symfony2:在呈现的控制器中访问 cookie
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.
我正在使用 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.