Как объединить строки в twig
кто-нибудь знает, как объединить строки в Twig? Я хочу сделать что-то вроде:
{{ concat('http://', app.request.host) }}
11 ответов
Это должно работать нормально:
{{ 'http://' ~ app.request.host }}
чтобы добавить фильтр типа "trans" - в том же теге используйте
{{ ('http://' ~ app.request.host) | trans }}
As указывает Адам Элсодани, вы также можете использовать интерполяция строк, для этого требуются строки с двойными кавычками:
{{ "http://#{app.request.host}" }}
также малоизвестной особенностью в Twig является интерполяция строк:
{{ "http://#{app.request.host}" }}
в этом случае, когда вы хотите вывести простой текст и переменную, вы можете сделать это следующим образом:
http://{{ app.request.host }}
Если вы хотите объединить некоторые переменные, решение alessandro1997 будет намного лучше.
оператор, который вы ищете, - это Тильда ( ~ ), как сказал Алессандро, и вот он в документации:
~: преобразует все операнды в строки и объединяет их. {{ "Привет "~ имя ~"!"}} вернется (предполагая, что имя "Джон") Привет, Джон!. – 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 }}
Как вы можете видеть это работает с фильтрами и функциями без необходимости использовать set
на отдельной линии.
всякий раз, когда вам нужно использовать фильтр с конкатенированной строкой (или базовой математической операцией), вы должны обернуть его с помощью (). Например.:
{{ ('http://' ~ app.request.host) | url_encode }}
в Symfony вы можете использовать это для протокола и Хоста:
{{ app.request.schemeAndHttpHost }}
хотя @alessandro1997 дал идеальный ответ о конкатенации.
можно использовать ~
как {{ foo ~ 'inline string' ~ bar.fieldName }}
но вы также можете создать свой собственный 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 }
чтобы смешивать строки, переменные и переводы, я просто делаю следующее:
{% 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>
' %}
несмотря на то, что все смешивается, он работает как шарм.
быстрый ответ (TL;DR)
- конкатенация строки веточки также может быть выполнена с помощью
format()
фильтр
Подробный Ответ
контекст
- прутик 2.x
- построение и конкатенация строк