src/Base/EventSubscriber/QuerySubscriber.php line 42

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Base\EventSubscriber;
  4. use App\Base\Service\AbstractQueryService;
  5. use Doctrine\Common\Collections\ArrayCollection;
  6. use Pimcore\Bundle\DataHubBundle\Event\GraphQL\Model\QueryTypeEvent;
  7. use Pimcore\Bundle\DataHubBundle\Event\GraphQL\QueryEvents;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. class QuerySubscriber implements EventSubscriberInterface
  10. {
  11.     /**
  12.      * @var ArrayCollection|null
  13.      */
  14.     private ArrayCollection|null $serviceContainer;
  15.     /**
  16.      * QuerySubscriber constructor.
  17.      */
  18.     public function __construct()
  19.     {
  20.         $this->serviceContainer = new ArrayCollection();
  21.     }
  22.     /**
  23.      * @return string[]
  24.      */
  25.     public static function getSubscribedEvents()
  26.     {
  27.         return [
  28.             QueryEvents::PRE_BUILD => 'onPreBuild',
  29.         ];
  30.     }
  31.     /**
  32.      * @param QueryTypeEvent $event
  33.      * @throws \Exception
  34.      */
  35.     public function onPreBuild(QueryTypeEvent $event): void
  36.     {
  37.         $config $event->getConfig();
  38.         foreach ($this->serviceContainer->getValues() as $service) {
  39.             /** @var AbstractQueryService $service */
  40.             $class = new \ReflectionClass($service);
  41.             foreach ($class->getMethods(\ReflectionMethod::IS_PUBLIC) as $method) {
  42.                 $name $method->getName();
  43.                 if (str_starts_with($name'query')) {
  44.                     $queryName lcfirst(substr($name5));
  45.                     $config['fields'][$queryName] = $service->getByName($queryName$event);
  46.                 }
  47.             }
  48.         }
  49.         $event->setConfig($config);
  50.     }
  51. }