src/EventSubscriber/MeasurementViewSubscriber.php line 69

Open in your IDE?
  1. <?php
  2. /**
  3.  * @license SILK SOFTWARE HOUSE SP Z O O
  4.  */
  5. namespace App\EventSubscriber;
  6. use App\Entity\DemoToken;
  7. use App\Entity\Measurement;
  8. use App\Factory\MeasurementViewFactory;
  9. use App\Model\View\MeasurementView;
  10. use Doctrine\ORM\EntityManagerInterface;
  11. use Doctrine\ORM\EntityManagerInterface as EntityManager;
  12. use Symfony\Component\HttpKernel\Event\ControllerArgumentsEvent;
  13. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  14. use Symfony\Component\HttpKernel\KernelEvents;
  15. /**
  16.  * Class MeasurementViewSubscriber.
  17.  */
  18. class MeasurementViewSubscriber implements EventSubscriberInterface
  19. {
  20.     /**
  21.      * Factory.
  22.      *
  23.      * @var MeasurementViewFactory
  24.      */
  25.     private $factory;
  26.     /**
  27.      * Entity manager.
  28.      *
  29.      * @var EntityManager
  30.      */
  31.     private $entityManager;
  32.     /**
  33.      * MeasurementViewSubscriber constructor.
  34.      *
  35.      * @param MeasurementViewFactory $factory
  36.      * @param EntityManagerInterface $entityManager
  37.      */
  38.     public function __construct(MeasurementViewFactory $factoryEntityManagerInterface $entityManager)
  39.     {
  40.         $this->factory $factory;
  41.         $this->entityManager $entityManager;
  42.     }
  43.     /**
  44.      * Get subscribed events.
  45.      *
  46.      * @return array
  47.      */
  48.     public static function getSubscribedEvents()
  49.     {
  50.         // return the subscribed events, their methods and priorities
  51.         return [
  52.             KernelEvents::CONTROLLER_ARGUMENTS => [
  53.                 ['onControllerArguments'1],
  54.             ],
  55.         ];
  56.     }
  57.     /**
  58.      * On kernel controller.
  59.      *
  60.      * @param ControllerArgumentsEvent $event
  61.      */
  62.     public function onControllerArguments(ControllerArgumentsEvent $event)
  63.     {
  64.         if (!$event->isMasterRequest()) {
  65.             return;
  66.         }
  67.         $arguments $event->getArguments();
  68.         $viewArgumentKey null;
  69.         foreach ($arguments as $key => $argument) {
  70.             if ($argument instanceof MeasurementView) {
  71.                 $viewArgumentKey $key;
  72.                 break;
  73.             }
  74.         }
  75.         // Building a measurement view loads every channel and probe. Do not do
  76.         // that work for the many controllers that only happen to have an "id"
  77.         // route parameter (for example, a device id).
  78.         if (null === $viewArgumentKey || !($view $this->createView($event))) {
  79.             return;
  80.         }
  81.         $arguments[$viewArgumentKey] = $view;
  82.         $event->setArguments($arguments);
  83.     }
  84.     /**
  85.      * Create view.
  86.      *
  87.      * @param ControllerArgumentsEvent $event
  88.      *
  89.      * @return MeasurementView|null
  90.      */
  91.     private function createView(ControllerArgumentsEvent $event)
  92.     {
  93.         foreach ($event->getArguments() as $argument) {
  94.             if ($argument instanceof Measurement) {
  95.                 return $this->factory->create($argument);
  96.             }
  97.         }
  98.         if ($measurementId = ((int) $event->getRequest()->get('id'))) {
  99.             if ($measurement $this->entityManager->getRepository(Measurement::class)->find($measurementId)) {
  100.                 return $this->factory->create($measurement);
  101.             }
  102.         }
  103.         if (!empty($event->getRequest()->get('token'))) {
  104.             /** @var DemoToken $demoToken */
  105.             $demoToken $this->entityManager->getRepository(DemoToken::class)->findOneBy(['token' => $event->getRequest()->get('token')]);
  106.             if ($demoToken) {
  107.                 return $this->factory->create($demoToken->getMeasurement());
  108.             }
  109.         }
  110.         return null;
  111.     }
  112. }