Ottenere l'URL di base del sito Web e passarlo globalmente a twig in Symfony 2


Risposte:


92

Perché hai bisogno di ottenere questo URL di root? Non puoi generare direttamente URL assoluti?

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

Questo codice Twig genererà l'http: // url completo alla rotta _demo_hello.

In effetti, ottenere l'URL di base del sito Web significa ottenere solo l'URL completo del percorso della home page:

{{ url('homepage') }}

( homepage , o qualunque cosa tu chiami nel tuo file di routing).


Grazie mille, pensavo che questa fosse la strada da percorrere, ma sapevo solo della funzione {{path (..)}}, che portava a risultati errati. {{url}} è proprio quello di cui avevo bisogno.
Geoffrey De Vylder

nel caso in cui sto eseguendo il rendering del ramoscello dal comando della console di symfony, diciamo per generare un modello di posta elettronica, ho bisogno dell'URL di base. Come faccio in quel caso.
Vishal


Se non sto usando twig, come posso riscriverlo in PHP ?
Nis

1
Non funzionante Errore irreversibile: Sintassi_errore_errore non rilevato: funzione "url" sconosciuta in "default / template / extension / module / Featured.twig" alla riga 5. J: \ xampp \ htdocs \ sites \ opencart3020 \ system \ library \ template \ Twig \ ExpressionParser.php: 574 Stack trace: # 0
Kamlesh

143

Questo è ora disponibile gratuitamente nei modelli twig (testato su sf2 versione 2.0.14)

{{ app.request.getBaseURL() }}

Nelle versioni successive di Symfony (testate sulla 2.5), prova:

{{ app.request.getSchemeAndHttpHost() }}

36
Questo può anche essere abbreviato in {{ app.request.baseUrl }}(individuerà il metodo getter e lo chiamerà automaticamente)
Colin O'Dell,

2
@Colin O'Dell, inoltre, è ancora più appropriato NON USARE le chiamate di metodo nella vista - la vista non dovrebbe sapere quali metodi sono nell'oggetto. Anche se sembra leggermente diverso in symfony, ma comunque +10 per quella risposta.
thorinkor

1
Se non sto usando twig, come posso riscriverlo in PHP ?
Nis

6
Questo NON funziona nelle versioni successive (testato su sf 2.5). La risposta seguente {{ app.request.getSchemeAndHttpHost() }}funziona!
RayOnAir

55

Puoi utilizzare il nuovo metodo di richiesta getSchemeAndHttpHost():

{{ app.request.getSchemeAndHttpHost() }}

1
Questa funzione è stata introdotta in Symfony 2.1
COil

35

Valido da Symfony v2.1 a v4.1 +

Se vuoi l'URL di base per un'applicazione Symfony, dovresti usare getSchemeAndHttpHost()concatenato insieme a getBaseUrl(), in modo simile a come getUri()funziona, tranne senza il percorso del router e la stringa di query.

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

Ad esempio, se l'URL del tuo sito web Symfony risiede in https://www.stackoverflow.com/app1/ , questi due metodi restituiscono questi valori:

getSchemeAndHttpHost

https://www.stackoverflow.com

getBaseUrl

/app1

Nota: getBaseUrl()include il nome del file dello script (cioè /app.php) se è nell'URL.


34

L'URL di base è definito all'interno Symfony\Component\Routing\RequestContext.

Può essere recuperato dal controller in questo modo:

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

17

Per Symfony 2.3+, per ottenere l'URL di base in un controller dovrebbe essere

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

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

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

o dal controller

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

3

Anche per js / css / URL immagine c'è una comoda funzione asset ()

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

2
Aggiungi qualche spiegazione in più alla tua risposta: dopotutto l'asset usa baseUrl? Nei miei progetti, stampa solo un URL relativo
Nico Haase

2

Invece di passare la variabile al modello globalmente, puoi definire un modello di base e renderizzare la "parte globale" in esso. Il modello di base può essere ereditato.

Esempio di rendering di template Dalla documentazione di symfony:

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

2

Per la versione corrente di Symfony (al momento della stesura di questa risposta è Symfony 4.1) non accedere direttamente al contenitore dei servizi come fatto in alcune delle altre risposte.

Invece (a meno che non utilizzi la configurazione dei servizi standard), inietta l'oggetto richiesta mediante il suggerimento del tipo.

<?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;
    }
}

Vedere anche la documentazione ufficiale di Symfony su come recuperare l'oggetto richiesta corrente .



0

In una situazione che coinvolge un'applicazione multi-dominio, app.request.getHttpHostmi ha aiutato. Restituisce qualcosa come example.como subdomain.example.com(o example.com:8000quando la porta non è standard). Questo era in Symfony 3.4.


-1

Ho provato tutte le opzioni qui ma non hanno funzionato per me. Alla fine l'ho fatto funzionare usando

{{ URL del sito }}

Spero che questo aiuti qualcuno che sta ancora lottando.


Da dove viene questo? Cosa sitecontiene?
Nico Haase

Questo è di Timber e Wordpress.
Konstantinos
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.