Je passe de CodeIgniter à Symfony 2. Quelqu'un peut-il me donner un exemple pour savoir comment:
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).
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() }}
Vous pouvez utiliser la nouvelle méthode de requête getSchemeAndHttpHost()
:
{{ app.request.getSchemeAndHttpHost() }}
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()
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.
Pour Symfony 2.3+, l’obtention de l’URL de base dans un contrôleur doit être
$this->get('request')->getSchemeAndHttpHost();
<base href="{{ app.request.getSchemeAndHttpHost() }}"/>
ou du contrôleur
$this->container->get('router')->getContext()->getSchemeAndHttpHost()
De plus, pour les URL js/css/image, il y a une fonction function asset ()
<img src="{{ asset('image/logo.png') }}"/>
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>
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 .
{{ dump(app.request.server.get('DOCUMENT_ROOT')) }}
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.