在 Symfony 6 中,我需要调用第一个对象(名为 Script),然后这个对象将调用第二个对象(规则),这个规则将调用执行各种操作的最后一个对象(条件)。一旦 Condition 对象完成其工作,它必须将其结果发送回 Rule 对象,Rule 对象应该将其传递给第一个 Script 对象。 我想使用 Messenger 来管理此工作流程,因为我需要将这些不同的对象存储在队列中并异步处理它们。另一方面,我知道 Messenger 的设计初衷并不是在消息完成后返回数据;因此,我考虑让消息处理程序调度事件,每个调用者对象都会监听以获取其子响应:
#[AsMessageHandler]
readonly final class CritereMessageHandler
{
public function __construct(
private EntityManagerInterface $em,
private AlarmHelper $alarmHelper,
private EventDispatcherInterface $dispatcher
) {}
/**
* @param CritereMessage $message
* @return void
* @throws Exception
*/
public function __invoke(CritereMessage $message): void
{
$critere = $this->em->getRepository(Critere::class)
->find($message->getId());
$query = $this->em->getConnection()->executeQuery($critere->getRequete())->fetchOne();
$result = $this->alarmHelper->parseEvaluation(
$query,
$critere->getEvaluation()->getOperateur(),
$critere->getEvaluation()->getValeur1(),
$critere->getEvaluation()->getValeur2()
);
$message->setResult($result);
$this->dispatcher->dispatch(
new CriteriumResponseEvent($message),
CriteriumResponseEvent::NAME
);
}
}
class CriteriumResponseEvent extends Event
{
public const NAME = 'alarm.criterium.response';
public function __construct(private readonly CritereMessage $criterium) {}
public function getCriterium(): CritereMessage
{
return $this->criterium;
}
}
class AlarmTestCommand extends Command
{
public function __construct(
private readonly MessageBusInterface $messageBus,
private readonly EventDispatcherInterface $dispatcher
)
{
parent::__construct();
}
protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$envelope = $this->messageBus->dispatch(new CritereMessage('leclair', 2, 'xxx', 'yyy'));
$this->dispatcher->addListener(CriteriumResponseEvent::NAME, function (CriteriumResponseEvent $event): void {
// dump is not called
dump($event);
});
$io->success('You have a new command! Now make it your own! Pass --help to see your options.');
return Command::SUCCESS;
}
}
我的问题是,经过各种尝试后,我无法从主进程中的事件监听器获取数据。我不明白我会错过什么,有人看到出了什么问题吗?
提前致谢
我选择了不同的概念来满足我的需求。