obtener la URL actual en la plantilla de ramita?

169

Busqué el código para obtener la ruta actual en una plantilla Twig (y no la URL completa), es decir, no quiero http://www.sitename.com/page, solo necesito /page.

Mark Cibor
fuente
11
Este NO es un duplicado exacto, ya que la respuesta n. ° 2 contiene información necesaria (sobre los parámetros de solicitud) que la pregunta vinculada no proporciona. Uno debe combinar la respuesta # 2 en la pregunta vinculada.
Victor Sergienko
1
prueba app.request.requestUri.
Kristóf Dombi
77
No es un tonto en absoluto. Votación para reabrir. Publicar mi respuesta como un comentario porque no puedo responder ahora ... {{ app.request.getBaseUrl ~ app.request.getPathInfo }}(el getBaseUrlbit es opcional; solo es necesario si no está instalado en la raíz del dominio)
mpen

Respuestas:

250
{{ path(app.request.attributes.get('_route'),
     app.request.attributes.get('_route_params')) }}

Si desea leerlo en una variable de vista:

{% set currentPath = path(app.request.attributes.get('_route'),
                       app.request.attributes.get('_route_params')) %}

La appvariable de vista global contiene todo tipo de accesos directos útiles, como app.sessiony app.security.token.user, que hacen referencia a los servicios que puede usar en un controlador.

Rodney Folz
fuente
9
desafortunadamente, esto no funcionará si tiene una ruta con parámetros obligatorios.
Martin Schuhfuß
Si está utilizando Twig sin Symfony, puede hacer algo como esto: $ twig-> addGlobal ("CurrentUrl", $ _SERVER ["REQUEST_URI"]);
GateKiller
1
Si su ruta tiene parámetros obligatorios, consulte la respuesta a continuación .
Sam
@GateKiller Esto hizo que fallara mi prueba funcional:Uncaught PHP Exception PHPUnit_Framework_Error_Notice: "Undefined index: REQUEST_URI"
Robin
Gracias por una respuesta increíble, muy útil!
Vahe Shadunts
199

Obtener URL actual : {{ app.request.uri }}en Symfony 2.3, 3, 4, 5


Obtener solo ruta : {{ app.request.pathinfo }}(sin parámetros)


Obtener solicitud uri : {{ app.request.requesturi }}(con parámetros)

mrzmyr
fuente
1
Este es el único que funcionó para mí. Todos los demás omitieron los parámetros de consulta que no formaban parte de la ruta o dependían del controlador y no de Twig.
Craig
13
Para obtener el camino solo intente {{ app.request.pathinfo }}o vea una lista de métodos disponibles en/vendor/symfony/http-foundation/Symfony/Component/HttpFoundation/Request.php
Michael
2
Esta debería ser la respuesta correcta. Corto y liso.
Fabian Picone
2
uriObtiene la URL con los parámetros. pathinfoobtiene la ruta sin parámetros. requestUriObtiene la ruta CON parámetros. requestUridebe agregarse a esta respuesta IMO. Rara vez necesitará el dominio, y rara vez querrá eliminar los parámetros.
rybo111
115

En Symfony 2.1 puedes usar esto:

{{ path(app.request.attributes.get('_route'), 
        app.request.attributes.get('_route_params')) }}

En Symfony 2.0, una solución es escribir una extensión de ramita para esto

public function getFunctions()
{
    return array(
        'my_router_params' => new \Twig_Function_Method($this, 'routerParams'),
    );
}

/**
 * Emulating the symfony 2.1.x $request->attributes->get('_route_params') feature.
 * Code based on PagerfantaBundle's twig extension.
 */
public function routerParams()
{
    $router = $this->container->get('router');
    $request = $this->container->get('request');

    $routeName = $request->attributes->get('_route');
    $routeParams = $request->query->all();
    foreach ($router->getRouteCollection()->get($routeName)->compile()->getVariables() as $variable) {
        $routeParams[$variable] = $request->attributes->get($variable);
    }

    return $routeParams;
}

Y usar así

{{ path(app.request.attributes.get('_route'), my_router_params()|merge({'additional': 'value'}) }}

No necesitará todo esto a menos que desee agregar parámetros adicionales a sus enlaces, como en un buscapersonas, o si desea cambiar uno de los parámetros.

Bártfai Tamás
fuente
11
Si desea generar el enlace actual en Twig y cambiar la configuración regional para el cambio de idioma, puede hacerlo en Symfony 2.1 de la siguiente manera: {{ruta (app.request.attributes.get ('_ route'), app.request.attributes .get ('_ route_params') | merge ({'_ locale': 'ja'}))}} Puede funcionar si usa la extensión Twig de Bártfai Tamás
Naytzyrhc el
Para su implementación 2.0, recibo un error que dice que no hay contenedor. ¿Entonces agregué la variable como se hace en PagerfantaBundle, pero luego dice que tengo que implementar ContainerInterface?
Squazic
Debe crear un constructor para esta extensión, que tiene un parámetro $ container. Luego, en la configuración DIC, debe declarar el contenedor como un parámetro para la extensión. Como aquí en TwigBundle
Bártfai Tamás
12
Los _route_parameters no funcionarán si tiene algunos parámetros adicionales en su cadena de consulta. En su lugar, podría usar app.request.query.all.
wdev
34

Puede obtener la URL actual en Twig de esta manera:

{{ app.request.schemeAndHttpHost ~ app.request.requestUri }}
Zaheer Babar
fuente
20

Cabe señalar que si tiene parámetros de consulta adicionales en su URL, que no son parte de la ruta configurada, la respuesta aceptada no los incluirá en la URL (ruta) actual.

¿Por qué quieres parámetros adicionales?

Por ejemplo, si tiene una página de lista con registros que se pueden filtrar por palabra clave y la página tiene paginación, lo más probable es que las variables de consulta para "palabra clave" y "página" no estén en su ruta. Pero en los botones de avance y retroceso para paginación, necesita la URL actual completa (que contiene las palabras clave para que la siguiente página todavía se filtre). Y necesita modificar la variable de página.

Cómo combinar parámetros de consulta adicionales

Para que pueda obtener la ruta actual y combinar las variables adicionales (después de modificar una o más de esas variables adicionales). Tenga en cuenta que está fusionando sus propias variables con app.request.query.all, y luego fusionando esa matriz en app.request.attributes.get('_route_params'). El path()método requiere que proporcione todos los parámetros necesarios de la ruta, por lo que debe incluir el _route_params.

{{ path(app.request.attributes.get('_route'), app.request.attributes.get('_route_params')|merge(app.request.query.all|merge({'page': 2 }))) }}

Eso es realmente feo, pero si está desarrollando la paginación, deberá modificar la variable de página en cada enlace por separado, por lo que debe incluir todo el asunto cada vez. Quizás otros tengan una mejor solución.

Chadwick Meyer
fuente
2
Probablemente debería ser{{ path(app.request.attributes.get('_route'), app.request.query.all|merge(app.request.attributes.get('_route_params'))) }}
FDisk
2

Si está utilizando Silex 2, ya no puede acceder al objeto Solicitar.

Puede acceder a los atributos de solicitud actuales de esta manera.

app.request_stack.currentrequest.attributes.get('_route')

Y para generar la URL actual completa: path(app.request_stack.currentrequest.attributes.get('_route'), app.request_stack.currentrequest.attributes.get('_route_params'))

Tim
fuente
Puede obtener la URL actual en la ramita / Silex 2 como esto: global.request.attributes.get('_route'). Se requiere puente de ramita .
dsoms