Como concatenar cordas no galho

447

Alguém sabe como concatenar cordas no galho? Eu quero fazer algo como:

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

Respostas:

872

Isso deve funcionar bem:

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

Para adicionar um filtro - como 'trans' - na mesma tag, use

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

Como Adam Elsodaney aponta , você também pode usar a interpolação de strings , isso requer strings com aspas duplas:

{{ "http://#{app.request.host}" }}
Alessandro Desantis
fonte
3
Obrigado pela resposta. Mas parece que | O filtro trans não funciona nisso (por exemplo: {{'test_' ~ name | trans}} não traduzirá meus itens. Você tem uma idéia de como fazer isso? thx! #
guillaumepotier
12
Sim, você precisa criar uma variável para armazenar a sequência concatenada. Por exemplo: {% set foo = 'http://' ~ app.request.host %}. E então você pode fazer: {{ foo | trans }}.
Alessandro Desantis
75
Tradução em uma linha: {{('test_' ~ name) | trans}}
Johnny
6
Obrigado. Portanto, o problema é que os filtros têm maior precedência que o operador de concatenação.
Alessandro Desantis 31/03/2012
Isso funcionou para mim concat strings passadas para uma função como um argumento, com filtros na variável e o próprio token de função: {{ form_open('admin/files/?path='~file_path|urlencode)|raw }}Não há necessidade de uma variável extra.
Wesley Murch #
90

Também um recurso pouco conhecido no Twig é a interpolação de strings :

{{ "http://#{app.request.host}" }}
Adam Elsodaney
fonte
20
Bom recurso. Esteja ciente, apenas de seqüências de citação dupla!
bzeaman
26

O operador que você está procurando é Tilde (~), como disse Alessandro, e aqui está na documentação:

~: Converte todos os operandos em seqüências de caracteres e concatena-os. {{"Olá" ~ nome ~ "!" }} retornaria (assumindo que o nome seja 'John') Olá John !. - http://twig.sensiolabs.org/doc/templates.html#other-operators

E aqui está um exemplo em outro lugar nos documentos :

{% set greeting = 'Hello' %}
{% set name = 'Fabien' %}

{{ greeting ~ name|lower }}   {# Hello fabien #}

{# use parenthesis to change precedence #}
{{ (greeting ~ name)|lower }} {# hello fabien #}
Nabil Kadimi
fonte
22

Nesse caso, onde você deseja gerar texto sem formatação e uma variável, faça o seguinte:

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

Se você deseja concatenar algumas variáveis, a solução de alessandro1997 seria muito melhor.

alghimo
fonte
2
isso não funciona para mim, porque eu tenho que url_encode a seqüência inteira com outro filtro ...
stoefln
14
{{ ['foo', 'bar'|capitalize]|join }}

Como você pode ver, isso funciona com filtros e funções sem a necessidade de usar setem uma linha separada.

Simon Epskamp
fonte
11

Sempre que você precisar usar um filtro com uma string concatenada (ou uma operação matemática básica), envolva-a com (). Por exemplo.:

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

lsouza
fonte
1
Muito útil, obrigado. Eu precisava concatenar variáveis ​​para usar como uma chave de tradução.
afilina
6

No Symfony, você pode usar isso para protocolo e host:

{{ app.request.schemeAndHttpHost }}

Embora @ alessandro1997 tenha dado uma resposta perfeita sobre concatenação.

Minras
fonte
6

Você pode usar ~como{{ foo ~ 'inline string' ~ bar.fieldName }}

Mas você também pode criar sua própria concatfunção para usá-la como em sua pergunta:
{{ concat('http://', app.request.host) }} :

No 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';
    }
}

Em app/config/services.yml:

services:
    app.twig_extension:
        class: AppBundle\Twig\AppExtension
        public: false
        tags:
            - { name: twig.extension }
luchaninov
fonte
Uma solução muito boa
Daniel
3

Resposta Rápida (TL; DR)

  • A concatenação de cordas de galho também pode ser feita com o format()filtro

Resposta detalhada

Contexto

  • Twig 2.x
  • Construção e concatenação de strings

Problema

  • Cenário: DeveloperGailSim deseja fazer concatenação de strings no Twig
    • Outras respostas neste tópico já tratam do operador concat
    • Esta resposta se concentra no formatfiltro que é mais expressivo

Solução

  • Abordagem alternativa é usar o formatfiltro
  • O formatfiltro funciona como a sprintffunção em outras linguagens de programação
  • O formatfiltro pode ser menos pesado que o operador ~ para strings mais complexas

Exemplo00

  • example00 string concat bare

    {{"% s% s% s!" | formato ('alfa', 'bravo', 'charlie')}}
    
    --- resultado -
    
    alphabravocharlie!
    
    

Exemplo01

  • example01 string concat com texto intermediário

    {{"O% s em% s cai principalmente no formato% s!" | ('Alpha', 'bravo', 'charlie')}}
    
    --- resultado -
    
    O alfa no bravo recai principalmente sobre o charlie!
    
    

Exemplo02

  • example02 string concat com formatação numérica
  • segue a mesma sintaxe que sprintfem outros idiomas

    {{"O% 04d em% 04d cai principalmente no formato% s!" | (2,3, 'tree')}}
    
    --- resultado -
    
    O 0002 em 0003 cai principalmente na árvore!
    
    

Veja também

dreftymac
fonte
1

Para misturar strings, variáveis ​​e traduções, basta fazer o seguinte:

    {% 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>
    ' %}

Apesar de tudo estar misturado, funciona como um encanto.

Gingi
fonte
-1

O delimitador "{{...}}" também pode ser usado dentro de strings:

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