97
src/EventSubscriber/RedirectToLocaleSubscriber.php
Normal file
97
src/EventSubscriber/RedirectToLocaleSubscriber.php
Normal file
@@ -0,0 +1,97 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the Symfony package.
|
||||
*
|
||||
* (c) Fabien Potencier <fabien@symfony.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace App\EventSubscriber;
|
||||
|
||||
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
|
||||
use Symfony\Component\HttpFoundation\RedirectResponse;
|
||||
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
|
||||
|
||||
/**
|
||||
* When visiting the homepage, this listener redirects the user to the most
|
||||
* appropriate localized version according to the browser settings.
|
||||
*
|
||||
* See http://symfony.com/doc/current/components/http_kernel/introduction.html#the-kernel-request-event
|
||||
*
|
||||
* @author Oleg Voronkovich <oleg-voronkovich@yandex.ru>
|
||||
*/
|
||||
class RedirectToLocaleSubscriber
|
||||
{
|
||||
/**
|
||||
* @var UrlGeneratorInterface
|
||||
*/
|
||||
private $urlGenerator;
|
||||
|
||||
/**
|
||||
* List of supported locales.
|
||||
*
|
||||
* @var string[]
|
||||
*/
|
||||
private $locales = [];
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private $defaultLocale = '';
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param UrlGeneratorInterface $urlGenerator
|
||||
* @param string $locales Supported locales separated by '|'
|
||||
* @param string|null $defaultLocale
|
||||
*/
|
||||
public function __construct(UrlGeneratorInterface $urlGenerator, $locales, $defaultLocale = null)
|
||||
{
|
||||
$this->urlGenerator = $urlGenerator;
|
||||
|
||||
$this->locales = explode('|', trim($locales));
|
||||
if (empty($this->locales)) {
|
||||
throw new \UnexpectedValueException('The list of supported locales must not be empty.');
|
||||
}
|
||||
$this->defaultLocale = $defaultLocale ?: $this->locales[0];
|
||||
|
||||
if (!in_array($this->defaultLocale, $this->locales)) {
|
||||
throw new \UnexpectedValueException(
|
||||
sprintf('The default locale ("%s") must be one of "%s".', $this->defaultLocale, $locales)
|
||||
);
|
||||
}
|
||||
|
||||
// Add the default locale at the first position of the array,
|
||||
// because Symfony\HttpFoundation\Request::getPreferredLanguage
|
||||
// returns the first element when no an appropriate language is found
|
||||
array_unshift($this->locales, $this->defaultLocale);
|
||||
$this->locales = array_unique($this->locales);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param GetResponseEvent $event
|
||||
*/
|
||||
public function onKernelRequest(GetResponseEvent $event)
|
||||
{
|
||||
$request = $event->getRequest();
|
||||
|
||||
// Ignore sub-requests and all URLs but the homepage
|
||||
if ('/' !== $request->getPathInfo()) {
|
||||
return;
|
||||
}
|
||||
// Ignore requests from referrers with the same HTTP host in order to prevent
|
||||
// changing language for users who possibly already selected it for this application.
|
||||
if (0 === stripos($request->headers->get('referer'), $request->getSchemeAndHttpHost())) {
|
||||
return;
|
||||
}
|
||||
|
||||
$preferredLanguage = $request->getPreferredLanguage($this->locales);
|
||||
|
||||
$response = new RedirectResponse($this->urlGenerator->generate('homepage', ['_locale' => $preferredLanguage]));
|
||||
$event->setResponse($response);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user