src/EventSubscriber/ParamSettingsSubscriber.php line 82

Open in your IDE?
  1. <?php
  2. /**
  3.  * @license SILK SOFTWARE HOUSE SP Z O O
  4.  */
  5. namespace App\EventSubscriber;
  6. use App\Annotation\ApplySettings;
  7. use App\Entity\Device;
  8. use App\Entity\Measurement;
  9. use App\Entity\MeasurementSetting;
  10. use App\Factory\MeasurementViewFactory;
  11. use App\Model\View\MeasurementView;
  12. use Doctrine\ORM\EntityManagerInterface as EntityManager;
  13. use Symfony\Component\HttpKernel\Event\ControllerArgumentsEvent;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. use Symfony\Component\HttpKernel\KernelEvents;
  16. use Doctrine\Common\Annotations\Reader;
  17. use ReflectionClass;
  18. use ReflectionException;
  19. /**
  20.  * Class ParamSettingsSubscriber.
  21.  */
  22. class ParamSettingsSubscriber implements EventSubscriberInterface
  23. {
  24.     /**
  25.      * Entity manager.
  26.      *
  27.      * @var EntityManager
  28.      */
  29.     private $entityManager;
  30.     /**
  31.      * Annotation reader.
  32.      *
  33.      * @var Reader
  34.      */
  35.     private $annotationReader;
  36.     /**
  37.      * Factory.
  38.      *
  39.      * @var MeasurementViewFactory
  40.      */
  41.     private $factory;
  42.     /**
  43.      * CacheSubscriber constructor.
  44.      *
  45.      * @param EntityManager          $entityManager
  46.      * @param Reader                 $reader
  47.      * @param MeasurementViewFactory $factory
  48.      */
  49.     public function __construct(EntityManager $entityManagerReader $readerMeasurementViewFactory $factory)
  50.     {
  51.         $this->annotationReader $reader;
  52.         $this->entityManager $entityManager;
  53.         $this->factory $factory;
  54.     }
  55.     /**
  56.      * Get subscribed events.
  57.      *
  58.      * @return array
  59.      */
  60.     public static function getSubscribedEvents()
  61.     {
  62.         // return the subscribed events, their methods and priorities
  63.         return [
  64.             KernelEvents::CONTROLLER_ARGUMENTS => [
  65.                 ['onControllerArguments'2],
  66.             ],
  67.         ];
  68.     }
  69.     /**
  70.      * On kernel controller.
  71.      *
  72.      * @param ControllerArgumentsEvent $event
  73.      */
  74.     public function onControllerArguments(ControllerArgumentsEvent $event)
  75.     {
  76.         if (!$event->isMasterRequest()) {
  77.             return;
  78.         }
  79.         $annotation $this->getSettingAnnotation($event->getController());
  80.         if (null === $annotation) {
  81.             return;
  82.         }
  83.         $view null;
  84.         foreach ($event->getArguments() as $argument) {
  85.             if ($argument instanceof Measurement) {
  86.                 $this->applySettingsOnMeasurements($argument);
  87.             }
  88.             if ($argument instanceof Device && $argument->getLastMeasurement()) {
  89.                 $this->applySettingsOnMeasurements($argument->getLastMeasurement());
  90.             }
  91.         }
  92.     }
  93.     /**
  94.      * Apply settings on measurements.
  95.      *
  96.      * @param Measurement $measurement
  97.      */
  98.     private function applySettingsOnMeasurements(Measurement $measurement)
  99.     {
  100.         $this->entityManager->getRepository(MeasurementSetting::class)->create($measurement);
  101.     }
  102.     /**
  103.      * Does controller have idempotent annotation.
  104.      *
  105.      * @param callable $controllerData
  106.      *
  107.      * @return ApplySettings|null
  108.      */
  109.     private function getSettingAnnotation($controllerData)
  110.     {
  111.         $annotation null;
  112.         if (!is_array($controllerData)) {
  113.             return null;
  114.         }
  115.         list($controllerObject$methodName) = $controllerData;
  116.         try {
  117.             $controller = new ReflectionClass($controllerObject);
  118.             $method $controller->getMethod($methodName);
  119.             $annotation $this->annotationReader->getMethodAnnotation($methodApplySettings::class);
  120.         } catch (ReflectionException $e) {
  121.             return null;
  122.         }
  123.         return $annotation instanceof ApplySettings $annotation null;
  124.     }
  125. }