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.
Geoffrey De Vylder
la source

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).

Damien
la source
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() }}
codecowboy
la source
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() }}
Hugo Nogueira
la source
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.

Matt Janssen
la source
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()
Sumanchalki
la source
17

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

$this->get('request')->getSchemeAndHttpHost();
Monsieur 14
la source
$this->container->get('request')->getSchemeAndHttpHost()
Alex Quintero du
16
 <base href="{{ app.request.getSchemeAndHttpHost() }}"/>

ou du contrôleur

$this->container->get('router')->getContext()->getSchemeAndHttpHost()
user3869574
la source
3

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

<img src="{{ asset('image/logo.png') }}"/>
Ceinture
la source
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>
Sethunath
la source
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 .

Arvid
la source
0
{{ dump(app.request.server.get('DOCUMENT_ROOT')) }}
Ivan Proskuryakov
la source
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.

ACJ
la source
-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.

user12531260
la source
D'où est-ce que ça vient? Que sitecontient?
Nico Haase
Cela vient de Timber et Wordpress.
Konstantinos le