web-dev-qa-db-fra.com

obtenir l'URL actuelle dans le modèle twig?

J'ai cherché le code pour obtenir le chemin actuel dans un modèle Twig (et non l'URL complète), c'est-à-dire que je ne veux pas de http://www.sitename.com/page, je n'ai besoin que de /page.

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

Si vous voulez le lire dans une variable de vue:

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

La variable de vue globale app contient toutes sortes de raccourcis utiles, tels que app.session et app.security.token.user, qui référencent les services que vous pourriez utiliser dans un contrôleur.

233
Rodney Folz

Obtenir RL actuelle: {{ app.request.uri }} in Symfony 2.3, 3, 4


Obtenir chemin uniquement: {{ app.request.pathinfo }}

177
mrzmyr

Dans symfony 2.1, vous pouvez utiliser ceci:

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

Dans symfony 2.0, une solution consiste à écrire une extension twig pour cette

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;
}

Et utiliser comme ça

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

Tout cela ne sera nécessaire que si vous souhaitez ajouter des paramètres supplémentaires à vos liens, comme dans un pager, ou si vous souhaitez modifier l'un des paramètres.

114
Bártfai Tamás

Vous pouvez obtenir l'URL actuelle dans Twig comme ceci:

{{ app.request.schemeAndHttpHost ~ app.request.requestUri }}
33
Zaheer Babar

Il est à noter que si votre URL contient des paramètres de requête supplémentaires, qui font pas partie de la route configurée, la réponse acceptée ne les inclura pas dans l'URL actuelle (chemin d'accès).

Pourquoi voudriez-vous des paramètres supplémentaires?

Par exemple, si vous avez une page de liste avec des enregistrements qui peuvent être filtrés par mot clé et que la page est paginée, il est fort probable que les variables de requête pour "mot clé" et "page" ne seront pas dans votre itinéraire. Toutefois, dans vos boutons Précédent et Précédent pour la pagination, vous avez besoin de l’URL actuelle complète (qui contient les mots-clés de sorte que la page suivante soit toujours filtrée). Et vous devez modifier la variable de page.

Comment fusionner des paramètres de requête supplémentaires

Ainsi, vous pouvez obtenir l'itinéraire actuel et fusionner les variables supplémentaires (après avoir modifié une ou plusieurs de ces variables supplémentaires). Notez que vous fusionnez vos propres variables dans le app.request.query.all, puis que vous fusionnez ce tableau dans le app.request.attributes.get('_route_params'). La méthode path() nécessite que vous fournissiez tous les paramètres requis de la route. C'est pourquoi vous devez inclure le _route_params.

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

C'est vraiment moche, mais si vous développez la pagination, vous devrez modifier la variable de page sur chaque lien, afin d'inclure le tout à chaque fois. Peut-être que d'autres ont une meilleure solution.

18
Chadwick Meyer

Si vous utilisez Silex 2, vous ne pouvez plus accéder à l'objet Request.

Vous pouvez accéder aux attributs de demande actuels de cette façon.

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

Et pour générer l'URL actuelle complète: path(app.request_stack.currentrequest.attributes.get('_route'), app.request_stack.currentrequest.attributes.get('_route_params'))

1
Tim