【问题标题】:Twig: filter in an if conditionTwig:在 if 条件下过滤
【发布时间】:2013-03-07 22:35:23
【问题描述】:

我想在 Twig 的 if 条件中使用过滤器。原因是 Symfony2 的一个属性,我无法直接比较,我必须提前更改它。我从这段代码开始:

{% if app.request.attributes.get('_controller')|split('::')|first == 'some\controller\name' %}
  do something
{% endif %}

很遗憾,这不起作用。所以我想我会在比较之前使用 set :

{% set controller = app.request.attributes.get('_controller')|split('::')|first %}
{% if controller == 'some\controller\name' %}
  do something
{% endif %}
{{ controller }} {# would print 'some\controller\name' #}

你猜怎么着?即使变量 controller 现在存在并且具有我与之比较的值,也不会打印“做某事”。我做错了什么?

【问题讨论】:

  • 您的视图中有太多逻辑,我会将逻辑移至控制器。让视图变得简单,也更容易测试。
  • 当我在视图本身中可以有一个逻辑表达式时,我看不出在控制器的每个操作中总是为模板分配相同的值有什么意义。这只会以容易出错的重复结束......
  • 它应该可以工作...你确定不在你的页面上使用缓存吗?
  • 我在开发环境中工作。这里没有缓存。真的很奇怪,因为过滤后的表达式总是打印正确的值,但是在if这样的语句标签中,它似乎不起作用...
  • 视图不应该与控制器紧密耦合,比较应该在控制器设置的值上描述视图感兴趣的内容。

标签: symfony twig


【解决方案1】:

好的,我测试过了,Twig 有一个奇怪的行为。 “\”被转义或类似的东西。 我用 var_dump 函数扩展了我的树枝环境,检查一下:

{{ var_dump("Sybio\Bundle\WebsiteBundle\Controller\MainController") }}
//string(48) "SybioBundleWebsiteBundleControllerMainController"

{{ var_dump(app.request.attributes.get('_controller')|split('::')|first) }}
// string(52) "Sybio\Bundle\WebsiteBundle\Controller\MainController"

{{ var_dump("Sybio\\Bundle\\WebsiteBundle\\Controller\\MainController") }}
// string(52) "Sybio\Bundle\WebsiteBundle\Controller\MainController"

这就是为什么你的测试总是错误的。 您需要将比较字符串的反斜杠加倍...

{% if app.request.attributes.get('_controller')|split('::')|first == 'some\\controller\\name' %}
  do something
{% endif %}

【讨论】:

猜你喜欢
  • 2017-08-04
  • 2017-01-26
  • 2012-01-13
  • 1970-01-01
  • 2019-10-20
  • 2012-06-23
  • 2016-02-11
  • 2020-07-07
  • 2015-04-22
相关资源
最近更新 更多