我在Symfony2中发现了一些关于cookie的问题和页面,但似乎没有就这究竟是如何工作的问题达成任何明确的共识。当然,我可以回到使用PHP的原生setcookie
函数,但我觉得使用Symfony2也应该很容易。
我在我的控制器中有一个动作,我只想返回一个带有cookie的视图。到目前为止,我看起来基本上都是这样的例子:
use Symfony\Compentnt\HttpFoundation\Response;
public function indexAction() {
$response = new Response();
$response->headers->setCookie(new Cookie('name', 'value', 0, '/');
$response->send();
}
这个问题是它发送响应......并且不呈现视图。如果我在不发送标题的情况下设置cookie,则会呈现视图,但不会发送标题(cookie)。
在我周围找到了响应对象中的sendHeaders()
方法,所以我现在在返回之前在我的操作中手动调用它,这似乎有效:
public function indexAction() {
...
$response->sendHeaders();
return array('variables' => 'values');
}
但这真的是预期使用的模式吗?在symfony的早期版本中,我可以在控制器中设置标头,并期望视图控制器处理发送的任何内容。现在看来我必须从动作中手动发送它们才能使它工作,这意味着我必须从我设置标题的任何动作中调用它。这是否是这种情况或者是否有一些我错过的东西是如此明显以至于在任何文档中都没有人提到它甚至提到它?
答案 0 :(得分:19)
我认为你的选择正确:
$response->headers->setCookie(new Cookie('name', 'value', 0, '/'));
如果您要渲染模板,请在此处查看文档:
如果你看一下这条线:
return $this->render('AcmeArticleBundle:Article:index.html.twig');
基本上,render方法返回一个响应(控制器然后返回),它具有twig模板的内容,你所要做的只是截取:
$response = $this->render('AcmeArticleBundle:Article:index.html.twig');
$response->headers->setCookie(new Cookie('name', 'value', 0, '/'));
return $response;
我认为无论如何......