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


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


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() }}

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() }}

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.


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

17

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

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

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

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

o del controlador

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

3

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

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

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>

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 .



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.


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


¿De donde viene esto? ¿Qué sitecontiene?
Nico Haase

Eso es de Timber y Wordpress.
Konstantinos
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.