Obtenir l'URL de base du site Web et la transmettre globalement à twig dans Symfony 2


89

Je suis en train de passer de CodeIgniter à Symfony 2. Quelqu'un peut-il s'il vous plaît me donner un exemple de la façon de:

  • Obtenez l'URL de base (l'URL sans les parties spécifiques à l'itinéraire)
  • Passez globalement cette variable au bundle twig afin que je puisse l'utiliser dans chaque modèle.

Réponses:


92

Pourquoi avez-vous besoin de cette URL racine? Ne pouvez-vous pas générer directement des URL absolues?

{{ url('_demo_hello', { 'name': 'Thomas' }) }}

Ce code Twig générera l'url http: // complète de la route _demo_hello.

En fait, obtenir l'URL de base du site Web n'obtient que l'URL complète de l'itinéraire de la page d'accueil:

{{ url('homepage') }}

( page d'accueil , ou comme vous l'appelez dans votre fichier de routage).


Merci beaucoup, je pensais que c'était la voie à suivre mais je ne connaissais que la fonction {{path (..)}}, ce qui conduisait à de mauvais résultats. {{url}} est exactement ce dont j'avais besoin.
— Geoffrey De Vylder

au cas où je rendrais la brindille à partir de la commande de console symfony, disons pour générer un modèle de courrier électronique, j'ai besoin d'une URL de base. Comment faire dans ce cas.
— vishal le

1
Il existe un livre de recettes pour ça: symfony.com/doc/master/cookbook/console/sending_emails.html
— Damien

Si je n'utilise pas twig, comment puis-je réécrire cela en PHP ?
— Nis

1
Ne fonctionne pas Erreur fatale: Uncaught Twig_Error_Syntax: Fonction "url" inconnue dans "default / template / extension / module / features.twig" à la ligne 5. dans J: \ xampp \ htdocs \ sites \ opencart3020 \ system \ library \ template \ Twig \ ExpressionParser.php: 574 Trace de pile: # 0
— Kamlesh

143

Ceci est maintenant disponible gratuitement dans les modèles Twig (testé sur sf2 version 2.0.14)

{{ app.request.getBaseURL() }}

Dans les versions ultérieures de Symfony (testé sur 2.5), essayez:

{{ app.request.getSchemeAndHttpHost() }}

36
Cela peut même être raccourci à {{ app.request.baseUrl }}(il localisera la méthode getter et l'appellera automatiquement)
— Colin O'Dell

2
@Colin O'Dell en outre, il est encore plus approprié de NE PAS UTILISER les appels de méthode en vue - la vue ne doit pas savoir quelles méthodes sont dans l'objet. Bien que cela semble légèrement différent dans symfony, mais +10 pour cette réponse quand même.
— thorinkor

1
Si je n'utilise pas twig, comment puis-je réécrire cela en PHP ?
— Nis

6
Cela ne fonctionne PAS dans les versions ultérieures (testé sur sf 2.5). La réponse ci-dessous {{ app.request.getSchemeAndHttpHost() }}fonctionne!
— RayOnAir

55

Vous pouvez utiliser la nouvelle méthode de requête getSchemeAndHttpHost():

{{ app.request.getSchemeAndHttpHost() }}

1
Cette fonction a été introduite dans Symfony 2.1
— COil

35

Valable de Symfony v2.1 à v4.1 +

Si vous voulez l'URL de base vers une application Symfony, vous devez utiliser getSchemeAndHttpHost()concaténée avec getBaseUrl(), comme cela getUri()fonctionne, sauf sans le chemin du routeur et la chaîne de requête.

{{ app.request.schemeAndHttpHost ~ app.request.baseUrl }}

Par exemple, si l'URL de votre site Web Symfony se trouve à https://www.stackoverflow.com/app1/ , ces deux méthodes renvoient ces valeurs:

getSchemeAndHttpHost

https://www.stackoverflow.com

getBaseUrl

/app1

Remarque: getBaseUrl()inclut le nom de fichier du script (c'est-à-dire /app.php) s'il est dans votre URL.


34

L'URL de base est définie à l'intérieur Symfony\Component\Routing\RequestContext.

Il peut être récupéré à partir du contrôleur comme ceci:

$this->container->get('router')->getContext()->getBaseUrl()

17

Pour Symfony 2.3+, pour obtenir l'URL de base dans un contrôleur doit être

$this->get('request')->getSchemeAndHttpHost();

$this->container->get('request')->getSchemeAndHttpHost()
— Alex Quintero du

16
 <base href="{{ app.request.getSchemeAndHttpHost() }}"/>

ou du contrôleur

$this->container->get('router')->getContext()->getSchemeAndHttpHost()

3

Aussi pour les URL js / css / image, il y a une fonction pratique asset ()

<img src="{{ asset('image/logo.png') }}"/>

2
Veuillez ajouter des explications supplémentaires à votre réponse - Asset utilise-t-il la baseUrl après tout? Dans mes projets, il imprime juste une URL relative
— Nico Haase

2

Au lieu de passer la variable au modèle globalement, vous pouvez définir un modèle de base et y rendre la «partie globale». Le modèle de base peut être hérité.

Exemple de modèle de rendu de la documentation symfony:

<div id="sidebar">
  {% render "AcmeArticleBundle:Article:recentArticles" with {'max': 3} %}
</div>

2

Pour la version actuelle de Symfony (au moment d'écrire cette réponse, il s'agit de Symfony 4.1), n'accédez pas directement au conteneur de services comme cela a été fait dans certaines des autres réponses.

À la place (sauf si vous n'utilisez pas la configuration de services standard), injectez l'objet de requête en indiquant le type.

<?php

namespace App\Service;

use Symfony\Component\HttpFoundation\RequestStack;

/**
 * The YourService class provides a method for retrieving the base URL.
 *
 * @package App\Service
 */
class YourService
{

    /**
     * @var string
     */
    protected $baseUrl;

    /**
     * YourService constructor.
     *
     * @param \Symfony\Component\HttpFoundation\RequestStack $requestStack
     */
    public function __construct(RequestStack $requestStack)
    {
        $this->baseUrl = $requestStack->getCurrentRequest()->getSchemeAndHttpHost();
    }

    /**
     * Returns the current base URL.
     *
     * @return string
     */
    public function getBaseUrl(): string
    {
        return $this->baseUrl;
    }
}

Consultez également la documentation officielle de Symfony sur la manière de récupérer l'objet de requête actuel .



0

Dans une situation impliquant une application multi-domaine, app.request.getHttpHostm'a aidé. Il renvoie quelque chose comme example.comou subdomain.example.com(ou example.com:8000lorsque le port n'est pas standard). C'était dans Symfony 3.4.


-1

J'ai essayé toutes les options ici mais elles n'ont pas fonctionné pour moi. Finalement, je l'ai fait fonctionner en utilisant

{{ URL du site }}

J'espère que cela aide quelqu'un qui a encore du mal.


D'où est-ce que ça vient? Que sitecontient?
— Nico Haase

Cela vient de Timber et Wordpress.
— Konstantinos le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.