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

标签 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");
}

最佳答案

您应该熟悉 event-dispatcher component symfony 的。底层模式是 Observer Pattern .

简而言之:事件是从一个服务(主题)派发的,以使其他服务(观察者)能够对它们使用react。

这是一个示例,您可以如何为 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 }

这应该给你一个开始。

更新:

由于事件监听器只不过是可调用对象(阅读:函数),您可以直接在命令中实现它们,也可以访问您的 $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');


}

关于php - 在 Symfony 的控制台命令中使用事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36791032/

相关文章:

php - 删除 mysql 记录在 codeIgniter 中不起作用

php - 如何在 phpMyAdmin -sql 中为两个表的主键使用唯一值? (在 PHP 中使用)

php - Doctrine 2 需要 Symfony 吗?

javascript - 为什么 "onmouseover"事件使用 "return true"来防止默认行为?

javascript - 在哪里可以找到 DOM 方法(?)(例如appendChild())的引用列表?

php - Laravel 自定义模型类 - 字段没有默认值

php - 处理一个数组以始终包含来自另一个数组的值的键(和顺序)

php - 如何在 Symfony2 中使用查询字符串路由 URL?

php - 如何在生产中禁用 Symfony2 中的探查器?

c# - c#中event关键字的使用