<?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; }}