在Symfony的控制台命令中使用事件监听器

时间:2016-04-22 10:16:14

标签: php symfony events

我使用GeniusesOfSymfony WebsocketBundle将websockets集成到我的系统中。

我现在正尝试使用以下代码推送通知(此代码位于symfony命令中)

protected function execute(InputInterface $input, OutputInterface $output)
{
    $messageData = array(
        'message' => $input->getArgument('message'),
        'title' => $input->getOption('title') === null ? $this->title : $input->getOption('title'),
        'timeout' => $input->getOption('timeout') === null ? $this->timeout : $input->getOption('timeout'),
    );

    $pusher = $this->getContainer()->get('gos_web_socket.zmq.pusher');
    $pusher->push($messageData, 'broadcast');

    $output->writeln('Message has been sent');
}

这完美无缺。但是,如何检查push()函数是否实际上已将消息推送到scoket服务器?我希望能够输出"消息已被发送"只有这确实是真的。

更新

GeniusesOfSymfony文档告诉我,有两个事件可以检查它是成功还是错误。

gos_web_socket.push_success
gos_web_socket.push_fail

但我认为我不能这样做:

if ($event('gos_web_socket.push_success')) {
    $output->writeLn("Message has been sent");
} else {
    $output->writeLn("Message has NOT been sent");
}

1 个答案:

答案 0 :(得分:2)

你应该熟悉symfony的event-dispatcher component。基础模式是Observer Pattern

简而言之:从服务(主题)调度事件,以使其他服务(观察者)能够对它们作出反应。

这是一个如何为gos_web_socket.push_success和gos_web_socket.push_fail

实现此功能的示例

首先,创建观察者(EventListeners):

use Gos\Bundle\WebSocketBundle\Event\PushHandlerEvent;
class AcmeListener
{
    // ...

    public function onSuccess(PushHandlerEvent $event)
    {
        // ... do something
    }

    public function onFailure(PushHandlerEvent $event)
    {
        // ... do something
    }
}

将此侦听器注册到services.yml中的相应事件:

服务:

  acme.socket_listeners:
    class:  "AcmeListener"
    tags:
      - { name: kernel.event_listener, event: gos_web_socket.push_success, method: onSuccess }
      - { name: kernel.event_listener, event: gos_web_socket.push_fail, method: onFailure }

这应该给你一个开始。

更新

由于事件监听器只不过是callables(读取:函数),您可以直接在命令中实现它们,也可以访问$ output:

protected function execute(InputInterface $input, OutputInterface $output)
{
    $messageData = array(
        'message' => $input->getArgument('message'),
        'title' => $input->getOption('title') === null ? $this->title : $input->getOption('title'),
        'timeout' => $input->getOption('timeout') === null ? $this->timeout : $input->getOption('timeout'),
    );

    $pusher = $this->getContainer()->get('gos_web_socket.zmq.pusher');
    $eventDispatcher = $this->getContainer()->get('event_dispatcher');
    $eventDispatcher->addListener(
        'gos_web_socket.push_success',
        function (PushHandlerEvent $event) use ($output) {
            $output->writeln('Message has been sent');
        }
    );
    $pusher->push($messageData, 'broadcast');


}