Comment concaténer des chaînes en brindille

Tout le monde sait comment concaténer des chaînes en brindille? Je veux faire quelque chose comme:

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

Cela devrait bien fonctionner:

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

Pour append un filtre – comme «trans» – dans la même balise

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

Comme le souligne Adam Elsodaney , vous pouvez également utiliser l’ interpolation de chaînes , cela nécessite des chaînes entre guillemets:

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

L’ interpolation de chaîne est également une caractéristique peu connue de Twig:

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

Dans ce cas, où vous voulez sortir du texte brut et une variable, vous pouvez le faire comme ceci:

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

Si vous voulez concaténer certaines variables, la solution alessandro1997 serait bien meilleure.

L’opérateur que vous recherchez est Tilde (~), comme Alessandro l’a dit, et la voici dans la documentation:

~: Convertit tous les opérandes en chaînes et les concatène. {{“Bonjour” ~ nom ~ “!” }} retournerait (en supposant que le nom est «John») Bonjour John !. – http://twig.sensiolabs.org/doc/templates.html#other-operators

Et voici un exemple ailleurs dans les docs :

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

Comme vous pouvez le voir, cela fonctionne avec des filtres et des fonctions sans avoir besoin d’utiliser un set sur une ligne séparée.

Chaque fois que vous devez utiliser un filtre avec une chaîne concaténée (ou une opération mathématique de base), vous devez l’envelopper avec (). Par exemple.:

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

Dans Symfony, vous pouvez l’utiliser pour le protocole et l’hôte:

 {{ app.request.schemeAndHttpHost }} 

Bien que @ alessandro1997 ait donné une réponse parfaite à propos de la concaténation.

Vous pouvez utiliser ~ comme {{ foo ~ 'inline ssortingng' ~ bar.fieldName }}

Mais vous pouvez également créer votre propre fonction de concat pour l’utiliser comme dans votre question:
{{ concat('http://', app.request.host) }} :

Dans src/AppBundle/Twig/AppExtension.php

  ['html']]), ]; } public function concat() { return implode('', func_get_args()) } /** * {@inheritdoc} */ public function getName() { return 'app_extension'; } } 

Dans app/config/services.yml :

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

Pour mélanger des chaînes, des variables et des traductions, je fais simplement ce qui suit:

  {% set add_link = '   ' %} 

Malgré tout mélangé, cela fonctionne comme un charme.

Réponse rapide (TL; DR)

  • La concaténation de chaîne de brindilles peut également se faire avec le filtre format()

Réponse détaillée

Le contexte

  • Twig 2.x
  • Construction de cordes et concaténation

Problème

  • Scénario: DeveloperGailSim souhaite effectuer une concaténation de chaîne dans Twig
    • D’autres réponses dans ce fil s’adressent déjà à l’opérateur de concat
    • Cette réponse se concentre sur le filtre de format qui est plus expressif

Solution

  • Une autre approche consiste à utiliser le filtre de format
  • Le filtre de format fonctionne comme la fonction sprintf dans d’autres langages de programmation
  • Le filtre de format peut être moins lourd que l’opérateur ~ pour les chaînes plus complexes

Example00

  • exemple00 chaîne concat nue

    
     {{"% s% s% s!" | format ('alpha', 'bravo', 'charlie')}}
    
     --- résultat --
    
     alphabravocharlie!
    
    

Exemple01

  • example01 ssortingng concat avec un texte intermédiaire

    
     {{"Le% s dans% s tombe principalement sur le format% s!" ('Alpha', 'bravo', 'charlie')}}
    
     --- résultat --
    
     L'alpha in bravo tombe principalement sur la charlie!
    
    

Exemple02

  • exemple02 chaîne de caractères avec format numérique
  • suit la même syntaxe que sprintf dans d’autres langues

    
     {{"Le% 04d dans% 04d tombe principalement sur le format% s!" | (2,3, 'tree')}}
    
     --- résultat --
    
     Le 0002 en 0003 tombe principalement sur l'arbre!
    
    

Voir également

Le “{{…}}” – délimiteur peut également être utilisé dans les chaînes:

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