我已经使用 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/