<?php
declare(strict_types=0);
/*
* WellCommerce Foundation
*
* This file is part of the WellCommerce package.
*
* (c) Adam Piotrowski <adam@wellcommerce.org>, Adrian Potepa <adrian@wellcommerce.org>
*
* For the full copyright and license information,
* please view the LICENSE file that was distributed with this source code.
*/
namespace WellCommerce\Bundle\AppBundle\EventListener;
use Symfony\Component\Console\ConsoleEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Messenger\Stamp\DelayStamp;
use WellCommerce\Bundle\AppBundle\Controller\Front\ApiController;
use WellCommerce\Bundle\AppBundle\Controller\Front\GraphController;
use WellCommerce\Bundle\AppBundle\Entity\Locale;
use WellCommerce\Bundle\AppBundle\Service\Messenger\CreateLocaleMessage;
use WellCommerce\Bundle\AppBundle\Service\Messenger\DeleteLocaleMessage;
use WellCommerce\Bundle\CoreBundle\Controller\Front\AbstractFrontController;
use WellCommerce\Bundle\CoreBundle\DependencyInjection\AbstractServiceSubscriber;
use WellCommerce\Bundle\CoreBundle\Doctrine\Event\EntityEvent;
/**
* Class LocaleSubscriber
*
* @author Adam Piotrowski <adam@wellcommerce.org>
*/
class LocaleSubscriber extends AbstractServiceSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
'locale.post_create' => ['onLocalePostCreate', 0],
'locale.pre_remove' => ['onLocalePreRemove', 0],
KernelEvents::REQUEST => ['onKernelRequest', 15],
KernelEvents::CONTROLLER => ['onKernelController', 15],
ConsoleEvents::COMMAND => ['onConsoleCommand', 0],
];
}
public function onKernelController(ControllerEvent $event)
{
$locale = $event->getRequest()->getLocale();
if (is_array($event->getController())) {
[$controller, $action] = $event->getController();
if ($controller instanceof AbstractFrontController) {
$this->getEntityManager()->getFilters()->enable('locale')->setParameter('locale', $locale);
}
}
}
public function onLocalePreRemove(EntityEvent $event)
{
$entity = $event->getEntity();
if ($entity instanceof Locale) {
$this->getMessageBus()->dispatch(new DeleteLocaleMessage($entity->getId(), $entity->getCode()), [
new DelayStamp($this->getKernel()->getContainer()->getParameter('messenger_delete_locale_message_delay')),
]);
}
}
public function onLocalePostCreate(EntityEvent $event)
{
$entity = $event->getEntity();
if ($entity instanceof Locale) {
$this->getMessageBus()->dispatch(new CreateLocaleMessage($entity->getId()), [
new DelayStamp($this->getKernel()->getContainer()->getParameter('messenger_create_locale_message_delay')),
]);
}
}
public function onConsoleCommand()
{
$filter = $this->getEntityManager()->getFilters()->enable('locale');
$filter->setParameter('locale', $this->getParameterBag()->get('locale'));
}
public function onKernelRequest(GetResponseEvent $event)
{
if ($event->getRequestType() == HttpKernelInterface::SUB_REQUEST) {
return;
}
$request = $event->getRequest();
if ($locale = $request->attributes->get('_locale')) {
$request->getSession()->set('_locale', $locale);
$this->getTranslatorHelper()->forceLocale($locale);
} else {
if ($request->hasSession()) {
$currentLocale = $request->getSession()->get('_locale', $request->getDefaultLocale());
$request->setLocale($currentLocale);
$this->getTranslatorHelper()->forceLocale($currentLocale);
}
}
}
}