3

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

1 Answer 1

2

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.

Sign up to request clarification or add additional context in comments.

1 Comment

thank you so much for this! In symfony 2.5 $this->generator->generate should be $this->router->generate

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.