3 votes

Passer les paramètres du chemin automatiquement

Je construis un site où l'utilisateur peut choisir le pays, l'état et la ville qu'il souhaite.

Une fois qu'il a sélectionné ces paramètres, il accède à une page comme celle-ci : en.example.com/spain/madrid/madrid/

Le problème est qu'à chaque fois que je veux construire une nouvelle url, je dois passer ces 3 variables et je me demandais si je pouvais faire quelque chose pour qu'elles soient identiques à celles de l'url. _locale que symfony lui-même passe aux paramètres.

Merci

2voto

PHP lover Points 238

Après avoir cherché davantage, j'ai trouvé ce message : http://blog.viison.com/post/15619033835/symfony2-twig-extension-switch-locale-current-route

J'ai juste utilisé l'idée et fait les changements dont j'avais besoin et voici le code final pour mon extension

<?php

namespace Comehoy\CoreBundle\Twig\Extension;

use Symfony\Bundle\FrameworkBundle\Routing\Router;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\HttpKernel;

class PathExtension extends \Twig_Extension
{

    private $request;
    private $router;

    public function __construct(Router $router) {
        $this->router = $router;
    }

    public function onKernelRequest(GetResponseEvent $event) {
        if ($event->getRequestType() === HttpKernel::MASTER_REQUEST) {
            $this->request = $event->getRequest();
        }
    }

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

    public function getPath($name, $parameters = array())
    {
        $parameters = array_merge($parameters, [
            'country' => $this->request->get('country'),
            'state' => $this->request->get('state'),
            'city' => $this->request->get('city'),
        ]);

        return $this->generator->generate($name, $parameters, false);
    }

    public function getName()
    {
        return 'twig_my_path_extension';
    }

}

Et pour ce qui est de la configuration, elle est identique à celle du poste.

services:
    twig.localized_route_extension:
        class: Acme\CoreBundle\Twig\PathExtension
        tags:
            - { name: twig.extension }
            - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
        arguments: [@router]

Et pour les itinéraires que j'utilise, le pays, l'état et la ville, je les mets dans le préfixe pour éviter de les répéter dans chaque itinéraire.

acme_core:
    resource: "@AcmeCoreBundle/Controller/"
    type:     annotation
    prefix:   /{country}/{state}/{city} 

J'espère que cela aidera quelqu'un d'autre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X