dwilda
dwilda

Reputation: 83

Symfony2: losing session variables after redirect

I have website which have three different translations, by default it is english, each translation is placed under his own subdomain. What I am trying to do, is redirect from subdomain de.mydomain.com to mydomain.com and set the translation's language in session variable named "locale", but the problem is that after redirection this session's variable disappears

config.yml

framework:
    session:
        lifetime:       3600
        cookie_domain: .mydomain

SubdomainListener:

class SubdomainListener
    {
        protected $domain;
        /* @var Translator */
        protected $translator;
        /* @var Router */
        protected $router;

        public function __construct($domain, $translator, $router)
        {
            $this->domain = $domain;
            $this->translator = $translator;
            $this->router = $router;
        }

        public function onDomainParse(GetResponseEvent $event)
        {

            if (HttpKernel::MASTER_REQUEST != $event->getRequestType()) {
                // don't do anything if it's not the master request
                return;
            }
            /* @var $request Request */
            $request = $event->getRequest();
            /* @var $session Session */
            $session = $request->getSession();

            $host = $request->getHost();
            $subDomain = str_replace($this->domain, '', $host);
            $supportedTranslations = array('pl_PL', 'en_US', 'de_DE');
            $preferredLanguage = $request->getPreferredLanguage();
            if (!in_array($preferredLanguage, $supportedTranslations)) {
                $preferredLanguage = 'en_US';
            }

            if (strlen($subDomain) > 0) {
                if ($subDomain == "pl.") {
                    $preferredLanguage = "pl_PL";
                } elseif ($subDomain == "en.") {
                    $preferredLanguage = "en_US";
                } elseif ($subDomain == "de.") {
                    $preferredLanguage = "de_DE";
                }

                $route = $request->get('_route');
                $routeParams = $request->get('_route_params');
                if (strpos($route, '_sd') === false) {
                    $route = $route . '_sd';
                }
                $url = $this->router->generate($route, $routeParams);

                $session->set('redirected', 1);
                $session->set('locale', $preferredLanguage);
                $this->translator->setLocale($preferredLanguage);
                $event->setResponse(new RedirectResponse($url, 301));
            }
            if (!$session->get('redirected')) {
                $session->set('locale', $preferredLanguage);
                $this->translator->setLocale($preferredLanguage);
            }
        }
    }

Upvotes: 2

Views: 4491

Answers (1)

Vitalii Zurian
Vitalii Zurian

Reputation: 17976

The reason for this "loss" is probably a usage of a non-domain cookie.

To turn this feature on you should specify your domain in the config. According to docs, for 2.2 and 2.1 versions of Symfony:

framework:
    session:
        cookie_domain: .yoursite.com

Upvotes: 2

Related Questions