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.