Кто-нибудь знает, как конкатенировать строки в веточке? Я хочу сделать что-то вроде:
{{ concat('http://', app.request.host) }}
Кто-нибудь знает, как конкатенировать строки в веточке? Я хочу сделать что-то вроде:
{{ concat('http://', app.request.host) }}
Это должно работать нормально:
{{ 'http://' ~ app.request.host }}
Чтобы добавить фильтр, например 'trans', в те же теги используйте
{{ ('http://' ~ app.request.host) | trans }}
Как указывает Адам Элсодани, вы также можете использовать строчную интерполяцию, это требует двойных кавычек:
{{ "http://#{app.request.host}" }}
Также малоизвестной особенностью Twig является интерполяция строк:
{{ "http://#{app.request.host}" }}
В этом случае, когда вы хотите вывести простой текст и переменную, вы можете сделать это следующим образом:
http://{{ app.request.host }}
Если вы хотите объединить некоторые переменные, решение alessandro1997 будет намного лучше.
Оператор, которого вы ищете, это Tilde (~), как сказал Алессандро, и вот он в документации:
~: Преобразует все операнды в строки и объединяет их. {{ "Здравствуйте" ~ name ~ "!" }} вернется (если имя "Джон" ) 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 }}
Как вы можете видеть, это работает с фильтрами и функциями без необходимости использовать 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 }
format()
format
, который более выразителенformat
format
работает как функция sprintf
в других языках программированияformat
может быть менее громоздким, чем оператор ~ для более сложных строкexample00 string concat bare
{{ "%s%s%s!"|format('alpha','bravo','charlie') }} --- result -- alphabravocharlie!
example01 строка concat с промежуточным текстом
{{ "The %s in %s falls mainly on the %s!"|format('alpha','bravo','charlie') }} --- result -- The alpha in bravo falls mainly on the charlie!
следует тот же синтаксис, что и sprintf
на других языках
{{ "The %04d in %04d falls mainly on the %s!"|format(2,3,'tree') }} --- result -- The 0002 in 0003 falls mainly on the tree!
Чтобы смешивать строки, переменные и переводы, я просто делаю следующее:
{% 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>
' %}
Несмотря на то, что все смешивается, оно работает как шарм.
"{{...}}" - разделитель также может использоваться в строках:
"http://{{ app.request.host }}"