【问题标题】:Attaching a cookie to a view in Symfony2将 cookie 附加到 Symfony2 中的视图
【发布时间】:2011-12-16 17:01:48
【问题描述】:

我在 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)。

四处寻找,我在 Response 对象中找到了 sendHeaders() 方法,所以我现在在返回之前在我的操作中手动调用它,这似乎有效:

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

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

【问题讨论】:

    标签: cookies http-headers symfony


    【解决方案1】:

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

    $response->headers->setCookie(new Cookie('name', 'value', 0, '/'));
    

    如果您尝试渲染模板,请查看此处的文档:

    Symfony2 Templating Service

    如果你看这条线:

    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;
    

    反正我觉得就是这样……

    【讨论】:

    • 仍在尝试了解 Symfony2。我在 Zend 框架中使用了类似的代码,从控制器内显式调用模板。我想我只是对为什么默认调用视图感到困惑,但如果我尝试修改响应,它不是。谢谢!
    • 你在Action上使用注解Template吗?如果是这样,那么该注释的空版本将呈现与操作同名的模板。如果您手动返回另一个响应,我认为它可能会覆盖 Template 注释,在这种情况下您不会获得视图内容。我不确定这是否完全正确,但可以想象注释就像一个包装器围绕执行 if ( !($controllerReturn instaceof Response) ) { // render template } else { return $controllerReturn; } 的操作。
    • 要跟进我的最后解释,您可以查看Sensio\Bundle\FrameworkExtraBundle\EventListener\TemplateListener 特别是onKernelView 方法,您可以看到它如何获取控制器的返回($parameters)并使用它们生成模板或直接退货。不过,这有点太深入了,我只是发布它,因为你似乎想要一个解释,有时这些就像一个恼人的痒;)。
    • 非常如此。非常感谢您的帮助。 Symfony2 绝对是与其之前的化身不同的野兽,所以我需要一些时间来弄清楚它所有神秘的内部运作方式!
    • 差不多 7 年后,我可能迟到了,但是在像 {{ render( controller("AppBundle:SomeControllerName:someActionName" )) }} 这样的渲染动作中使用它时,除非您明确使用 $response->sendHeaders(),否则不会发送 cookie。
    猜你喜欢
    • 2014-01-04
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 2019-02-09
    • 1970-01-01
    相关资源
    最近更新 更多