Как объединить строки в 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
  • построение и конкатенация строк

на "{{ ... }} "- разделитель также может использоваться в строках:

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