在Symfony2中 - > Twig,如何检测执行是从CLI模式还是通过浏览器?

时间:2011-11-03 09:17:00

标签: symfony twig

我正在制作一个Symfony2控制台命令,它将发送一个呈现Twig模板的电子邮件。 电子邮件模板使用一些标准布局,该布局也包含在从浏览器请求发送的电子邮件中。 在这个模板中,我有一些像这样的链接:

{{ url('deal_category_index', {'city':app.session.get('system.user.city'), 'slug':cat.getSlug()}) }}

但如果我在CLI模式下使用app.session,我会收到此错误:

An exception has been thrown during the rendering of a template ("You cannot create a service ("request") of an inactive scope ("request").")

所以我需要一种方法来了解模板是否从CLI呈现,因此我可以使用“通用”方式来创建此链接。

谢谢!

2 个答案:

答案 0 :(得分:0)

从控制器中的会话中提取城市并将其传递给render()函数。这样,您的模板应如下所示:

{{ url('deal_category_index', {'city': city, 'slug':cat.getSlug()}) }}

在你的控制器中:

$this->render("YourBundle:Yourcontroller:yourView.html.twig', array('city' => $this->get('session')->get('system.user.city'), 'cat' => $category);

在CLI中调用render()时,您应该从数据库而不是会话中获取城市。

答案 1 :(得分:0)

根据块中的请求上下文包装布局部分:

{% block foobar_url %}
  {{ url('deal_category_index', {'city':app.session.get('system.user.city')}) }}
{% endblock %}

在浏览器上下文发送的电子邮件中使用此布局,就像之前一样。

覆盖CLI模板中的代码块foobar_url,如下所示:

{% block foobar_url %}
  {{ url('deal_category_index', {'city':cityRetrievedFromDatabaseOrElsewhere}) }}
{% endblock %}