web-dev-qa-db-fra.com

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

Je passe de CodeIgniter à Symfony 2. Quelqu'un peut-il me donner un exemple pour savoir comment: 

  • Obtenir l'URL de base (l'URL sans les pièces spécifiques à l'itinéraire)
  • Passez globalement cette variable au groupe de brindilles afin que je puisse l'utiliser dans chaque modèle.
76
geoffreydv

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'intégralité de l'adresse http: // url vers la route _demo_hello.

En fait, obtenir l'URL de base du site Web, c'est obtenir uniquement l'URL complète de la route de la page d'accueil:

{{ url('homepage') }}

( homepage , ou ce que vous appelez dans votre fichier de routage).

81
Damien

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

{{ app.request.getBaseURL() }}

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

{{ app.request.getSchemeAndHttpHost() }}
126
codecowboy

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

{{ app.request.getSchemeAndHttpHost() }}
49
Hugo Nogueira

L'URL de base est défini dans Symfony\Component\Routing\RequestContext.

Il peut être récupéré depuis le contrôleur comme ceci:

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

Valable de Symfony v2.1 à v4.1 +

Si vous souhaitez que l'URL de base d'une application Symfony, vous devez utiliser getSchemeAndHttpHost() concaténé avec getBaseUrl(), de la même manière que 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 les valeurs suivantes:

getSchemeAndHttpHost

https://www.stackoverflow.com

getBaseUrl

/app1

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

24
Matt Janssen

Pour Symfony 2.3+, l’obtention de l’URL de base dans un contrôleur doit être

$this->get('request')->getSchemeAndHttpHost();
15
Mr. 14
 <base href="{{ app.request.getSchemeAndHttpHost() }}"/>

ou du contrôleur

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

De plus, pour les URL js/css/image, il y a une fonction function asset ()

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

Au lieu de transmettre une variable à un modèle globalement, vous pouvez définir un modèle de base et afficher la «partie globale» dans celui-ci. Le modèle de base peut être hérité.

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

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

Pour la version actuelle de Symfony (au moment de la rédaction de cette réponse, il s'agit de Symfony 4.1), n’accédez pas directement au conteneur de services, contrairement à ce qui est fait dans d’autres réponses.

Au lieu de cela (sauf si vous n'utilisez pas la configuration de services standard), injectez l'objet de requête en spécifiant 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;
    }
}

Voir aussi la documentation officielle de Symfony sur comment récupérer l'objet de requête actuel .

1
Arvid
{{ dump(app.request.server.get('DOCUMENT_ROOT')) }}
0
ivan.proskuryakov

app.request.getHttpHost m'a aidé dans une situation impliquant une application multi-domaines. Il retourne quelque chose comme example.com ou subdomain.example.com (ou example.com:8000 lorsque le port n'est pas standard). C'était dans Symfony 3.4.

0
ACJ