如何连接树枝中的string

任何人都知道如何连接树枝中的string? 我想做一些事情:

{{ concat('http://', app.request.host) }} 

这应该工作正常:

 {{ 'http://' ~ app.request.host }} 

要添加一个filter – 像“trans” – 在相同的标签使用

 {{ ('http://' ~ app.request.host) | trans }} 

正如Adam Elsodaney指出的 ,你也可以使用string插值 ,这需要双引号string:

 {{ "http://#{app.request.host}" }} 

另外Twig中一个鲜为人知的特性是string插值 :

 {{ "http://#{app.request.host}" }} 

在这种情况下,你想输出纯文本和variables,你可以这样做:

 http://{{ app.request.host }} 

如果你想连接一些variables,alessandro1997的解决scheme会更好。

你正在寻找的运营商是Tilde(〜),就像Alessandro说的那样,这里是在文档中:

〜:将所有操作数转换为string并连接它们。 {{“Hello”〜name〜“!” }}会返回(假设名字是'John')Hello John !. – http://twig.sensiolabs.org/doc/templates.html#other-operators

这里是文档中的其他地方的例子:

 {% set greeting = 'Hello' %} {% set name = 'Fabien' %} {{ greeting ~ name|lower }} {# Hello fabien #} {# use parenthesis to change precedence #} {{ (greeting ~ name)|lower }} {# hello fabien #} 
 {{ ['foo', 'bar'|capitalize]|join }} 

正如你所看到的,这可以使用filter和函数,而不需要使用单独的一行。

无论何时你需要使用一个连接string的filter(或者一个基本的math运算),你应该用()来包装它。 例如。:

{{ ('http://' ~ app.request.host) | url_encode }}

在Symfony中,你可以使用这个协议和主机:

 {{ app.request.schemeAndHttpHost }} 

虽然@ alessandro1997给出了关于连接的完美答案。

你可以使用~ {{ foo ~ 'inline string' ~ bar.fieldName }}

但是你也可以创build你自己的concat函数来在你的问题中使用它:
{{ concat('http://', app.request.host) }}

src/AppBundle/Twig/AppExtension.php

 <?php namespace AppBundle\Twig; class AppExtension extends \Twig_Extension { /** * {@inheritdoc} */ public function getFunctions() { return [ new \Twig_SimpleFunction('concat', [$this, 'concat'], ['is_safe' => ['html']]), ]; } public function concat() { return implode('', func_get_args()) } /** * {@inheritdoc} */ public function getName() { return 'app_extension'; } } 

app/config/services.yml

 services: app.twig_extension: class: AppBundle\Twig\AppExtension public: false tags: - { name: twig.extension } 

快速回答(TL; DR)

  • Twigstring连接也可以使用format()filter来完成

详细的答案

上下文

  • 树枝2.x
  • stringbuild立和连接

问题

  • 场景: DeveloperGailSim希望在Twig中进行string连接
    • 这个线程中的其他答案已经解决了concat操作符
    • 这个答案侧重于更具performance力的formatfilter

  • 另一种方法是使用formatfilter
  • formatfilter的工作原理与其他编程语言中的sprintf函数类似
  • 对于更复杂的string, formatfilter可能比〜运算符更简单

Example00

  • example00stringconcat裸露

    
     {{“%s%s%s!”|格式('alpha','bravo','charlie')}}
    
     ---结果 - 
    
     alphabravocharlie!
    
    

Example01

  • example01带有插入文本的stringconcat

    
     {{“%s中的%s主要落在%s!”|格式('alpha','bravo','charlie')}}
    
     ---结果 - 
    
    在布拉沃阿尔法主要落在查理!
    
    

Example02

  • example02string连字符与数字格式
  • 遵循与其他语言中的sprintf相同的语法

    
     {{“%04d中的%04d主要落在%s!”|格式(2,3,'tree')}}
    
     ---结果 - 
    
     0003中的0002主要落在树上!
    
    

也可以看看

要混合string,variables和翻译,我只需执行以下操作:

  {% set add_link = ' <a class="btn btn-xs btn-icon-only" title="' ~ 'string.to_be_translated'|trans ~ '" href="' ~ path('acme_myBundle_link',{'link':link.id}) ~ '"> </a> ' %} 

尽pipe一切都混在一起,它就像一个魅力。

“{{…}}”分隔符也可以在string中使用:

 "http://{{ app.request.host }}"