Search code examples
phphttp-redirectsymfonyroutessymfony-2.2

How to redirect without GET parameters using the routing?


My routing is defined like this :

# New URLs
article_show:
    pattern:  /article/{id}
    defaults: { _controller: AcmeDemoBundle:Article:show }

# Old URLs
article_show_legacy:
    path:            /article-{id}-{param}.html
    requirements:
        param: foo|bar
    defaults:
        _controller: FrameworkBundle:Redirect:redirect
        route:       article_show
        permanent:   true

I'd like to know how I can redirect article_show_legacy to article_show without param parameter. At the moment whenever I access /article-1-foo.html (for example), I'm redirected to /article/1?param=foo. I would like to discard ?param=foo so I'm redirected to /article/1.

I know I can create one route for foo and one route for bar but in my case there's more cases.

Do I have to write my own redirect controller ?


Solution

  • You have to write your own redirect controller or just create redirect method in any existing controller.

    Check redirect action of the RedirectController in ../vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/RedirectController.php for mor details.

    Some example (I added third option stripAttributes):

    public function redirectAction($route, $permanent = false, $stripAttributes = false)
    {
        if ('' == $route) {
            return new Response(null, $permanent ? 410 : 404);
        }
    
        $attributes = array();
        if (!$stripAttributes) {
            $attributes = $this->container->get('request')->attributes->get('_route_params');
            unset($attributes['route'], 
                  $attributes['permanent'], 
                  $attributes['stripAttributes']);
        }
    
        return new RedirectResponse($this->container->get('router')->generate($route, $attributes, UrlGeneratorInterface::ABSOLUTE_URL), $permanent ? 301 : 302);
    }