<?php
namespace App\EventListener;
use App\Api\ProthelisApi;
use App\Entity\User;
use Doctrine\ORM\EntityManager;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\Intl\Locale;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Security;
class LanguageListener
{
private $session;
private $storage;
private $security;
private $entityManager;
public function __construct(TokenStorageInterface $storage, \Doctrine\ORM\EntityManagerInterface $entityManager, Security $security) {
$this->storage = $storage;
$this->entityManager = $entityManager;
$this->security = $security;
}
public function setSession(Session $session)
{
$this->session = $session;
}
public function setLocale(RequestEvent $event)
{
try {
if ($this->security->isGranted('ROLE_PREVIOUS_ADMIN')) {
return;
}
} catch (\Exception $exception) {}
if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
return;
}
if ($this->storage->getToken() === null) {
return;
}
$request = $event->getRequest();
if (substr($request->headers->get('referer'),-5) === 'login') {
return;
}
/** @var User $user */
$user = $this->storage->getToken()->getUser();
if ($user instanceof User && $user->getId()) {
//only check when user is logged on
$locale = $user->getLocale();
if ($locale !== $request->attributes->get('_locale') && $request->attributes->get('_locale') !== null) {
$user->setLocale($request->attributes->get('_locale'));
$this->entityManager->persist($user);
$this->entityManager->flush();
ProthelisApi::updateApiUser($user);
}
Locale::setDefault($locale);
}
}
}