У меня есть довольно сложная команда (написанная не мной) в моем API Symfony для отправки уведомлений, и я хотел бы, чтобы она запускалась каждый раз, когда происходит событие PostPersist.
Для этого я установил прослушиватель, запускаемый событием PostPersist, и эта часть работает отлично. Однако мне не удается запустить команду. Сначала я попытался запустить его, как в контроллере, с помощью следующего фрагмента кода:
$kernel = $this->get('kernel');
$application = new Application($kernel);
$application->setAutoExit(false);
$input = new ArrayInput(array(
'command' => 'acme:send-notifications',
));
// You can use NullOutput() if you don't need the output
$output = new NullOutput();
$application->run($input, $output);
return new Response("");
но, конечно, это не работает в Listener, так как я не могу получить ядро Поэтому я попытался добавить в сервисы команду:
command.send-notifications:
class: WD\ApiBundle\Command\SendNotificationsCommand
tags:
- { name: 'console.command', command: 'acme:send-notifications' }
а затем назовите это так:
$output = new NullOutput();
$this->sendNotifCommand->execute(null, $output);
но затем я получаю следующее сообщение об ошибке:
The container cannot be retrieved as the application instance is not yet set.
Признаюсь, я не совсем понимаю, что это значит. Кроме того, я должен признаться, что эта часть symfony (слушатели, команды) для меня довольно нова, и я даже не знаю, правильно ли я делаю это, или есть лучшая система для отправки уведомлений каждый раз, когда происходит сохранение. в конкретном субъекте ...




Никогда не пробовал в слушателе, но вы можете попробовать запустить свою команду с помощью процесса:
$process = new Process("cd " . $this->projectDir . "; php bin/console YOUR_COMMAND_NAME");
$process->start();
Лучшим вариантом было бы поместить код домена, вызываемый в вашей команде, в службу и использовать его. Если вы можете, вы все еще можете ядро в своем слушателе