Pregunta

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

¿Fue útil?

Solución

{{ 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')) %}

los app La variable de vista global contiene todo tipo de atajos útiles, como app.session y app.security.token.user, que hacen referencia a los servicios que puede usar en un controlador.

Otros consejos

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


Obtener solo camino: {{ app.request.pathinfo }}

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 usa 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 desee cambiar uno de los parámetros.

Puede obtener la URL actual en ramita como esta:

{{ app.request.schemeAndHttpHost ~ app.request.requestUri }}

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

¿Por qué querrías 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, muy probablemente las variables de consulta para "palabra clave" y "página" no estarán en su ruta. Pero en sus botones de avance y retorno para la paginación, necesita la URL actual completa (que contiene las palabras clave para que la página siguiente todavía esté filtrada). Y debe modificar la variable de página.

Cómo fusionar los parámetros de consulta adicional

Por lo tanto, puede obtener la ruta actual y fusionarse en las variables adicionales (después de modificar una o más de esas variables adicionales). Tenga en cuenta que se está fusionando en sus propias variables al app.request.query.all, y luego fusionar esa matriz en el app.request.attributes.get('_route_params'). los path() El método requiere que proporcione todos los parámetros requeridos 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 paginación, deberá modificar la variable de página en cada enlace separado, por lo que debe incluir todo cada vez. Quizás otros tienen una mejor solución.

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top