<?php
namespace App\EventListener;
use App\Event\GlobalEventTypes;
use App\Event\SupplierEventMapperInterface;
use App\Event\SupplierTriggerReportEvent;
use Psr\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
class SupplierTriggerReportSubscriber extends SupplierEventSubscriber
{
public function __construct(
readonly protected ParameterBagInterface $parameterBag,
protected EventDispatcherInterface $dispatcher
) {
parent::__construct($dispatcher);
}
public static function getSubscribedEvents(): array
{
return [
GlobalEventTypes::TRIGGER_REPORT => 'onTriggerReport',
];
}
/**
* @throws \ReflectionException
*/
public function onTriggerReport(SupplierTriggerReportEvent $event): void
{
$providerCode = $event->getProviderCode();
/** @var SupplierEventMapperInterface $supplierEventMapper */
$supplierEventMapper = $this->parameterBag->get(sprintf('app.%s.event.mapper', $providerCode));
$supplierEventMap = $supplierEventMapper::$MAP;
$response = [
$providerCode => [],
];
foreach ($supplierEventMap as $hookName => $supplierTrigger) {
$eventInspector = new \ReflectionClass($supplierTrigger[2]);
$response[$providerCode][] = [
'name' => $hookName,
'event' => $supplierTrigger[0],
'requires' => array_map(fn ($p): string => $p->name, $eventInspector->getConstructor()->getParameters()),
'description' => $supplierTrigger[3],
];
}
$this->sendInterruptResponse($response);
}
}