web-dev-qa-db-fra.com

Comment utiliser le chemin absolu dans les fonctions twig

J'ai une application avec Symfony2 (2.2). Quand je veux envoyer un courrier, j'ai des problèmes avec les chemins, qui sont tous des chemins relatifs et ne fonctionnent évidemment pas dans les emails

pour rendre les chemins que j'utilise:

<a href="{{ path('route_name', {'param' : value}) }}">A link</a>

et pour les actifs:

<img src="{{ asset('bundle/myname/img/image.gif') }}" alt="Title"/>

Les exemples précédents fonctionnent bien mais les chemins sont relatifs, je dois donc ajouter le domaine. Je peux faire quelque chose comme:

<a href="http://domain.com{{ path('route_name', {'param' => param1}) }}">A link</a>

mais ce n'est pas la meilleure solution à mon problème, car j'ai différents domaines.

Mise à jour

J'ai trouvé la solution pour les chemins avec la fonction url mais j'ai toujours besoin d'une solution pour les actifs.

55
rkmax

Pour Symfony 2.7 et plus récent

Voir this répondre ici.

1ère option de travail

{{ app.request.scheme ~'://' ~ app.request.httpHost ~ asset('bundles/acmedemo/images/search.png') }}

2ème option de travail - préféré

Je viens de faire un test rapide avec une nouvelle copie propre de Symfony. Il existe également ne autre option qui combine schéma et httpHost:

{{ app.request.getSchemeAndHttpHost() ~ asset('bundles/acmedemo/images/search.png') }}
{# outputs #}
{# http://localhost/Symfony/web/bundles/acmedemo/css/demo.css  #}
79
SirDerpington

Symfony 2.7 a un nouveau absolute_url qui peut être utilisé pour générer l’URL absolue. http://symfony.com/blog/new-in-symfony-2-7-the-new-asset-component#template-function-changes

Cela fonctionnera sur ces deux cas ou sur une chaîne de chemin:

<a href="{{ absolute_url(path('route_name', {'param' : value})) }}">A link</a>

et pour les actifs:

<img src="{{ absolute_url(asset('bundle/myname/img/image.gif')) }}" alt="Title"/>

Ou pour tout chemin de chaîne

<img src="{{ absolute_url('my/absolute/path') }}" alt="Title"/>

sur ces cas d'arborescence, vous allez vous retrouver avec une URL absolue comme

http://www.example.com/my/absolute/path
107
Neto Buenrostro

Depuis documentation Symfony2 : Des URL absolues pour les actifs ont été introduites dans Symfony 2.5.

Si vous avez besoin d'URL absolues pour les actifs, vous pouvez définir le troisième argument (ou l'argument absolu) sur true:

Exemple:

<img src="{{ asset('images/logo.png', absolute=true) }}" alt="Symfony!" />
50
Daniel

La réponse de Daniel semble fonctionner correctement pour le moment, mais veuillez noter que la génération d'URL absolues à l'aide de la fonction asset de twig est maintenant obsolète:

DEPRECATED - La génération d’URL absolues avec la fonction Twig asset () est obsolète dans la version 2.7 et sera supprimée dans la version 3.0. Veuillez utiliser absolute_url () à la place.

Voici l'annonce officielle: http://symfony.com/blog/new-in-symfony-2-7-the-new-asset-component#template-function-changes

Vous devez utiliser le absolute_url twig fonction:

{# Symfony 2.6 #}
{{ asset('logo.png', absolute = true) }}

{# Symfony 2.7 #}
{{ absolute_url(asset('logo.png')) }}

Il est intéressant de noter que cela fonctionne également avec la fonction path:

{{ absolute_url(path('index')) }}
23
Quentin S.

Vous voulez probablement utiliser le assets_base_urls configuration.

framework:
    templating:
        assets_base_urls:
            http:   [http://www.website.com]
            ssl:   [https://www.website.com]

http://symfony.com/doc/current/reference/configuration/framework.html#assets


Notez que la configuration est différente depuis Symfony 2.7 :

framework:
    # ...
    assets:
        base_urls:
            - 'http://cdn.example.com/'
13
cheesemacfly

Ce qui suit fonctionne pour moi:

<img src="{{ asset('bundle/myname/img/image.gif', null, true) }}" />
3
Indivision Dev

Il est possible d'avoir http://test_site.com et https://production_site.com . Ensuite, coder l’URL en dur est une mauvaise idée. Je suggérerais ceci:

{{app.request.scheme ~ '://' ~ app.request.Host ~ asset('bundle/myname/img/image.gif')}}
3
Iliya Kolev

J'ai utilisé les conseils suivants de la documentation https://symfony.com/doc/current/console/request_context.html pour obtenir des URL absolues dans les courriels:

# config/services.yaml
parameters:
    router.request_context.Host: 'example.org'
    router.request_context.scheme: 'https'
1
antongorodezkiy