Cookies 将cookie附加到Symfony2中的视图

Cookies 将cookie附加到Symfony2中的视图,cookies,http-headers,symfony,Cookies,Http Headers,Symfony,我在Symfony2中发现了一些关于cookies的问题和页面,但对于这应该如何工作,似乎没有任何明确的共识。当然,我可以回过头来使用PHP的原生setcookie函数,但我觉得使用Symfony2也应该很容易 我的控制器中有一个操作,我只想从中返回一个附加了cookie的视图。到目前为止,我看到的例子基本上是这样的: use Symfony\Compentnt\HttpFoundation\Response; public function indexAction() { $respon

我在Symfony2中发现了一些关于cookies的问题和页面,但对于这应该如何工作,似乎没有任何明确的共识。当然,我可以回过头来使用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)

我在Response对象中找到了
sendHeaders()
方法,因此我现在在返回之前的操作中手动调用该方法,这似乎有效:

public function indexAction() {
  ...
  $response->sendHeaders();
  return array('variables' => 'values');
}

但这真的是预期使用的模式吗?在以前版本的symfony中,我可以在控制器中设置标题,并期望视图控制器能够处理我发送的任何内容。现在看来,我必须从操作中手动发送它们才能使其工作,这意味着我必须从我设置标题的任何操作中调用它。是这样,还是我遗漏了一些显而易见的东西,以至于没有人在任何文档中提及它?

我认为你的观点是正确的:

$response->headers->setCookie(new Cookie('name', 'value', 0, '/'));
如果您试图呈现模板,请查看此处的文档:

如果你看这一行:

return $this->render('AcmeArticleBundle:Article:index.html.twig');
基本上,render方法返回一个响应(控制器随后返回),该响应包含细枝模板的内容,您所要做的就是截取以下内容:

$response = $this->render('AcmeArticleBundle:Article:index.html.twig');
$response->headers->setCookie(new Cookie('name', 'value', 0, '/'));
return $response;

我想就这样吧……

我仍在努力了解Symfony2的情况。我在Zend framework中使用了类似的代码,从控制器中显式调用模板。我想我只是不明白为什么默认情况下会调用视图,但如果我试图修改响应,它就不会。谢谢您是否在操作上使用注释
模板
?如果是,则该注释的空版本将使用与操作相同的名称呈现模板。如果您手动返回另一个响应,我认为它可能会覆盖
模板
注释,在这种情况下,您将无法获得视图内容。我不确定这是否完全正确,但请将注释想象成围绕操作的包装器,该操作执行以下操作:
if(!($controllerReturn instaceof Response)){//render template}else{return$controllerReturn;}
。要继续我的上一个解释,您可以查看
Sensio\Bundle\FrameworkExtraBundle\EventListener\templatellistener
,特别是
onKernelView
方法,您可以看到它如何接受控制器的返回(
$parameters
)并使用它们生成模板或直接返回模板。不过,这有点过分了,我只是因为你似乎想得到一个解释才发布它,有时这就像是一个恼人的瘙痒;)。非常感谢。谢谢你的帮助。Symfony2绝对是一个不同于它前世的野兽,所以我需要一些时间来弄清楚它所有的神秘的内部运作方式,比如这个!大约7年后,我可能会迟到,但当在这样的呈现操作中使用它时,
{render(controller(“AppBundle:SomeControllerName:someActionName”)}
,除非您明确使用
$response->sendHeaders()