<?php
/**
* @license SILK SOFTWARE HOUSE SP Z O O
*/
namespace App\EventSubscriber;
use App\Entity\DemoToken;
use App\Entity\Measurement;
use App\Factory\MeasurementViewFactory;
use App\Model\View\MeasurementView;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityManagerInterface as EntityManager;
use Symfony\Component\HttpKernel\Event\ControllerArgumentsEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\KernelEvents;
/**
* Class MeasurementViewSubscriber.
*/
class MeasurementViewSubscriber implements EventSubscriberInterface
{
/**
* Factory.
*
* @var MeasurementViewFactory
*/
private $factory;
/**
* Entity manager.
*
* @var EntityManager
*/
private $entityManager;
/**
* MeasurementViewSubscriber constructor.
*
* @param MeasurementViewFactory $factory
* @param EntityManagerInterface $entityManager
*/
public function __construct(MeasurementViewFactory $factory, EntityManagerInterface $entityManager)
{
$this->factory = $factory;
$this->entityManager = $entityManager;
}
/**
* Get subscribed events.
*
* @return array
*/
public static function getSubscribedEvents()
{
// return the subscribed events, their methods and priorities
return [
KernelEvents::CONTROLLER_ARGUMENTS => [
['onControllerArguments', 1],
],
];
}
/**
* On kernel controller.
*
* @param ControllerArgumentsEvent $event
*/
public function onControllerArguments(ControllerArgumentsEvent $event)
{
if (!$event->isMasterRequest() || !($view = $this->createView($event))) {
return;
}
$arguments = $event->getArguments();
foreach ($arguments as $key => $argument) {
if ($argument instanceof MeasurementView) {
$arguments[$key] = $view;
$event->setArguments($arguments);
return;
}
}
}
/**
* Create view.
*
* @param ControllerArgumentsEvent $event
*
* @return MeasurementView|null
*/
private function createView(ControllerArgumentsEvent $event)
{
foreach ($event->getArguments() as $argument) {
if ($argument instanceof Measurement) {
return $this->factory->create($argument);
}
}
if ($measurementId = ((int) $event->getRequest()->get('id'))) {
if ($measurement = $this->entityManager->getRepository(Measurement::class)->find($measurementId)) {
return $this->factory->create($measurement);
}
}
if (!empty($event->getRequest()->get('token'))) {
/** @var DemoToken $demoToken */
$demoToken = $this->entityManager->getRepository(DemoToken::class)->findOneBy(['token' => $event->getRequest()->get('token')]);
if ($demoToken) {
return $this->factory->create($demoToken->getMeasurement());
}
}
return null;
}
}