【发布时间】:2017-12-15 17:37:45
【问题描述】:
按照these instructions,我已经使用以下命令安装了 Symfony 3.4。
composer.phar create-project symfony/framework-standard-edition my_project_name_3_4
然后,在 these other instructions 之后,我向股票控制台应用程序添加了一个事件调度程序,以及一个事件侦听器
#File: my_project_name_3_4/bin/console
/* ... other code ... */
$application = new Application($kernel);
//START: my new code
//create dispatcher and add to application
use Symfony\Component\EventDispatcher\EventDispatcher;
$dispatcher = new EventDispatcher();
$application->setDispatcher($dispatcher);
//add my event to dispatcher
use Symfony\Component\Console\Event\ConsoleCommandEvent;
use Symfony\Component\Console\ConsoleEvents;
$dispatcher->addListener(ConsoleEvents::COMMAND, function (ConsoleCommandEvent $event) {
exit("\n\nHey, Symfony called my event! Let's crash this party! \n\n");
});
//END: my new code
$application->run($input);
但是,当我运行 Symfony 控制台命令时,
php bin/console help
我的事件没有触发。当 Symfony 调用我的 ConsoleEvents::COMMAND 监听器时,我希望上面的代码会停止。
我已经做了一些调试,似乎从调度程序调用$application->run删除我的事件?!在我进入进行适量调试的兔子洞之前,我想检查一下是否有什么明显的我做错了,是否有已知的科学来解决这个问题。我应该以不同的方式将事件添加到现有的 Symfony 控制台应用程序吗?
【问题讨论】:
-
试试:$dispatcher = $kernel->getContainer()->get('event_dispatcher');
-
@Cerad 我们没有在
$kernel->boot()之前准备好容器,因此无法按原样工作,因此在您的代码之前添加$kernel->boot(),它应该可以工作。 -
在获取容器之前调用 $kernel->boot()。似乎工作。内核保护自己不被多次引导。
-
这是 FrameworkBundle:Application:doRun 方法,它将您的调度程序替换为容器的调度程序。我想如果你真的想要你也可以覆盖它。
-
感谢两者——而不是创建调度程序,进行早期内核启动,然后从应用程序容器
$kernel->boot(); $dispatcher = $kernel->getContainer()->get('event_dispatcher');获取调度程序,并使用该调度程序代替先前实例化的调度程序似乎有工作。不过,让这个问题悬而未决,因为早期手动启动感觉有点脏,而且似乎应该有更好的方法来做到这一点。很高兴对正式输入的答案进行投票,如果没有更好的结果,则将其标记为最佳。
标签: php symfony symfony-console