phpsymfony

Pass path parameters automatically


I'm building a site where the user can choose a country, state and city he wants.

Once he selects these parameters he goes to a page like this: en.example.com/spain/madrid/madrid/

The problem is, every time I want to build a new url, I must pass these 3 variables and I was wondering if I could do something to make them just like the _locale variable which symfony itself passes it to the parameters.

Thanks


Solution

  • After searching more I found this post: http://blog.viison.com/post/15619033835/symfony2-twig-extension-switch-locale-current-route

    I just used the idea and made the changes I needed and this is the final code for my 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';
        }
    
    }
    

    And as for the configuration its the same as the post

    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]
    

    And for the routes that I use country, state and the city I put them in the prefix to avoid repeating them in each route.

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

    Hope it helps someone else.