У меня есть EventSubscriberInterface, называемый PostCreation, который прослушивает событие POST_WRITE. Метод, вызываемый при возникновении события, должен вызывать службу в соответствии с атрибутом «type» объекта, на котором произошло событие.
Следующий код является рабочим примером того, что я хочу:
<?php
class PostCreation implements EventSubscriberInterface
{
private $processAfterPostCreationTypeAService;
private $processAfterPostCreationTypeBService;
public function __construct(
ProcessAfterPostCreationTypeAService $processAfterPostCreationTypeAService,
ProcessAfterPostCreationTypeBService $processAfterPostCreationTypeBService
) {
$this->processAfterPostCreationTypeAService = $processAfterPostCreationTypeAService;
$this->processAfterPostCreationTypeBService = $processAfterPostCreationTypeBService;
}
public static function getSubscribedEvents(): array
{
return [KernelEvents::VIEW => ['processPostCreation', EventPriorities::POST_WRITE]];
}
public function processPostCreation(GetResponseForControllerResultEvent $event): void
{
$myObject = $event->getControllerResult();
if (!$event->getRequest()->isMethod('POST') ||
!$myObject instanceof MyClass
) {
return;
}
/* some code */
if($myObject->getType() === 'A') {
$this->processAfterPostCreationTypeAService->doSomething($myObject);
} else if($myObject->getType() === 'B') {
$this->processAfterPostCreationTypeBService->doSomething($myObject);
}
/* some code */
}
}
Делать это таким способом невозможно, поэтому я бы хотел найти другое решение, но сам не могу его найти, поэтому мне нужна помощь:
- Конструктор PostCreation не может знать object.type, потому что он вызывается до наступления события
- Я не могу легко создать экземпляр ProcessAfterPostCreationTypeAService или ProcessAfterPostCreationTypeBService в методе processPostCreation, поскольку они также являются службами (и требуют внедрения зависимости, настроенного для автоматической проводки)
Я уверен, что инъекция зависимости может помочь мне, но я не могу найти, как.
Так, как сделать что-то обслуживаемое?