url - formato - twig document
Obtener la URL base del sitio web y pasarla globalmente a twig en Symfony 2 (11)
Estoy haciendo el cambio de CodeIgniter a Symfony 2. ¿Puede alguien darme un ejemplo de cómo hacerlo?
- Obtenga la url base (la url sin las partes específicas de la ruta)
- Globalmente pase esta variable al paquete twig para que pueda usarlo en cada plantilla.
¿Por qué necesita obtener esta URL raíz? ¿No puedes generar URL directamente absolutas?
{{ url(''_demo_hello'', { ''name'': ''Thomas'' }) }}
Este código de Twig generará la URL http: // completa en la ruta _demo_hello.
De hecho, obtener la url base del sitio web solo obtiene la URL completa de la ruta de la página principal:
{{ url(''homepage'') }}
( página de inicio , o como lo llame en su archivo de enrutamiento).
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 (probado en 2.5), pruebe:
{{ app.request.getSchemeAndHttpHost() }}
En lugar de pasar variable a plantilla globalmente, puede definir una plantilla base y representar la ''parte global'' en ella. La plantilla base puede ser heredada.
Ejemplo de plantilla de representación de la documentación de Symfony:
<div id="sidebar">
{% render "AcmeArticleBundle:Article:recentArticles" with {''max'': 3} %}
</div>
La URL base se define dentro de Symfony/Component/Routing/RequestContext
.
Se puede obtener desde el controlador de esta manera:
$this->container->get(''router'')->getContext()->getBaseUrl()
Para Symfony 2.3+, para obtener la url base en un controlador debe ser
$this->get(''request'')->getSchemeAndHttpHost();
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 por sugerencia 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 documentos oficiales de Symfony sobre cómo recuperar el objeto de solicitud actual .
Puede usar el nuevo método de solicitud getSchemeAndHttpHost()
:
{{ app.request.getSchemeAndHttpHost() }}
Si desea la URL base para una aplicación Symfony, debe usar getSchemeAndHttpHost()
concatenado junto con getBaseUrl()
, similar a cómo funciona getUri()
, excepto sin la ruta del enrutador y la cadena de consulta.
{{ app.request.schemeAndHttpHost ~ app.request.baseUrl }}
Por ejemplo, si su URL de sitio web de Symfony vive en https://www..com/app1/
, estos dos métodos devuelven estos valores:
getSchemeAndHttpHost
https://www..com
getBaseUrl
/app1
Nota: getBaseUrl()
incluye el nombre de archivo del script (es decir, /app.php
) si está en su URL.
También para las URL js / css / image hay un útil activo funcional ()
<img src="{{ asset(''image/logo.png'') }}"/>
<base href="{{ app.request.getSchemeAndHttpHost() }}"/>
o desde el controlador
$this->container->get(''router'')->getContext()->getSchemeAndHttpHost()
{{ dump(app.request.server.get(''DOCUMENT_ROOT'')) }}