Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Symfony2: Referrer object similar to Request object?

I am trying with no luck to find a "referrer" object for use in my controller. I expected there would be an object similar to the request object with parameters specifying the _controller, _route and arguments.

What I am trying to do is a language switcher action that redirects the user to the same page in the new language. Something along the lines of:

public function switchLangAction($_locale)
{
    $args = array();
    $newLang = ($_locale == 'en') ? 'fr' : 'en';

    // this is how I would have hoped to get a reference to the referrer request.
    $referrer = $this->get('referrer');
    $referrerRoute = $referrer->parameters->get('_route');
    $args = $referrer->parameters->get('args'); // not sure how to get the route args out of the params either!
    $args['_locale'] = $newLang;

    $response = new RedirectResponse( $this->generateUrl(
        $referrerRoute,
        $args
    ));

    return $response;
}

It's also possible that there is another way to do this - I know in rails there is the "redirect_to :back" method for example.

Any help would be greatly appreciated.

like image 639
Alexander Vasilenko Avatar asked Oct 10 '22 05:10

Alexander Vasilenko


1 Answers

Why not changing the locale in the user's session?

First, define your locales in the router

my_login_route:
    pattern: /lang/{_locale}
    defaults: { _controller: AcmeDemoBundle:Locale:changeLang }
    requirements:
        _locale: ^en|fr$

Then, set the session

namespace Acme\DemoBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class LocaleController extends Controller
{
    public function switchLangAction($_locale, Request $request)
    {
        $session = $request->getSession();
        $session->setLocale($_locale);
        // ... some other possible actions

        return $this->redirect($session->get('referrer'));
    }
}

In all other controllers you should set the session variable yourself by calling

$session->set('referrer', $request->getRequestUri());

You could also probably make an event listener to set the session variable for every page automatically.

like image 54
kgilden Avatar answered Oct 13 '22 00:10

kgilden