Obtener la URL base del sitio web y pasarla globalmente a twig en Symfony 2

Respuestas:

92

¿Por qué necesita obtener esta URL raíz? ¿No puedes generar directamente URL absolutas?

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

Este código Twig generará la URL http: // completa a la ruta _demo_hello.

De hecho, obtener la URL base del sitio web solo es obtener la URL completa de la ruta de la página de inicio:

{{ url('homepage') }}

( página de inicio , o como lo llame en su archivo de enrutamiento).

Damien
fuente
Muchas gracias, pensé que este era el camino a seguir, pero solo conocía la función {{ruta (..)}}, lo que genera resultados incorrectos. {{url}} es justo lo que necesitaba.
Geoffrey De Vylder
en caso de que esté renderizando la rama del comando de la consola de Symfony, digamos que para generar una plantilla de correo electrónico, necesito una URL base. ¿Cómo hago en ese caso?
vishal
1
Hay un libro de cocina para eso: symfony.com/doc/master/cookbook/console/sending_emails.html
Damien
Si no estoy usando twig , ¿cómo puedo reescribir esto en PHP ?
Nis
1
No funciona Error fatal: Twig_Error_Syntax no detectado: función "url" desconocida en "default / template / extension / module / Featured.twig" en la línea 5. en J: \ xampp \ htdocs \ sites \ opencart3020 \ system \ library \ template \ Twig \ ExpressionParser.php: 574 Seguimiento de pila: # 0
Kamlesh
143

Esto ahora está disponible de forma gratuita en plantillas twig (probado en sf2 versión 2.0.14)

{{ app.request.getBaseURL() }}

En versiones posteriores de Symfony (probadas en 2.5), intente:

{{ app.request.getSchemeAndHttpHost() }}
codigo vaquero
fuente
36
Esto incluso se puede acortar a {{ app.request.baseUrl }}(localizará el método getter y lo llamará automáticamente)
Colin O'Dell
2
@Colin O'Dell además, es aún más apropiado NO UTILIZAR las llamadas al método a la vista: la vista no debe saber qué métodos hay en el objeto. Aunque parece un poco diferente en Symfony, pero de todos modos +10 para esa respuesta.
Thorinkor
1
Si no estoy usando twig , ¿cómo puedo reescribir esto en PHP ?
Nis
6
Esto NO funciona en versiones posteriores (probado en sf 2.5). ¡La siguiente respuesta {{ app.request.getSchemeAndHttpHost() }}funciona!
RayOnAir
55

Puede utilizar el nuevo método de solicitud getSchemeAndHttpHost():

{{ app.request.getSchemeAndHttpHost() }}
Hugo Nogueira
fuente
1
Esta función se introdujo en Symfony 2.1
COil
35

Válido desde Symfony v2.1 hasta v4.1 +

Si desea la URL base para una aplicación Symfony, debe usar getSchemeAndHttpHost()concatenada junto con getBaseUrl(), similar a cómo getUri()funciona, excepto sin la ruta del enrutador y la cadena de consulta.

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

Por ejemplo, si la URL de su sitio web Symfony reside en https://www.stackoverflow.com/app1/, estos dos métodos devuelven estos valores:

getSchemeAndHttpHost

https://www.stackoverflow.com

getBaseUrl

/app1

Nota: getBaseUrl()incluye el nombre del archivo de secuencia de comandos (es decir /app.php) si está en su URL.

Matt Janssen
fuente
34

La URL base se define en el interior Symfony\Component\Routing\RequestContext.

Se puede obtener del controlador de esta manera:

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

Para Symfony 2.3+, para obtener la URL base en un controlador debe ser

$this->get('request')->getSchemeAndHttpHost();
Señor 14
fuente
$this->container->get('request')->getSchemeAndHttpHost()
Alex Quintero
16
 <base href="{{ app.request.getSchemeAndHttpHost() }}"/>

o del controlador

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

También para js / css / image urls hay una función útil asset ()

<img src="{{ asset('image/logo.png') }}"/>
Faja
fuente
2
Agregue una explicación más a su respuesta: ¿el activo usa baseUrl después de todo? En mis proyectos, solo imprime una URL relativa
Nico Haase
2

En lugar de pasar una variable a una plantilla globalmente, puede definir una plantilla base y representar la 'parte global' en ella. La plantilla base se puede heredar.

Ejemplo de plantilla de renderizado de la documentación de Symfony:

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

Para la versión actual de Symfony (al momento de escribir esta respuesta, es Symfony 4.1) no acceda directamente al contenedor de servicios como se hace en algunas de las otras respuestas.

En su lugar (a menos que no use la configuración de servicios estándar), inyecte el objeto de solicitud mediante sugerencias de 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;
    }
}

Consulte también los documentos oficiales de Symfony sobre cómo recuperar el objeto de solicitud actual .

Arvid
fuente
0
{{ dump(app.request.server.get('DOCUMENT_ROOT')) }}
Ivan Proskuryakov
fuente
0

En una situación que involucraba una aplicación multidominio, app.request.getHttpHostme ayudó. Devuelve algo como example.como subdomain.example.com(o example.com:8000cuando el puerto no es estándar). Esto fue en Symfony 3.4.

ACJ
fuente
-1

Probé todas las opciones aquí, pero no funcionaron para mí. Finalmente lo hice funcionar usando

{{ Sitio URL }}

Espero que esto ayude a alguien que todavía está luchando.

usuario12531260
fuente
¿De donde viene esto? ¿Qué sitecontiene?
Nico Haase
Eso es de Timber y Wordpress.
Konstantinos