我使用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");
}
答案 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');
}