如何在 hyperf 框架的命令行里使用 Sender 来发送 Socket 消息 ?

Hyperf\WebSocketServer\Sender消息发送器 ,可以在控制器里注入使用,直接给 fd 发送 socket 消息
我在控制器里,可以正常使用,但在命令行里,会报错
PHP Fatal error: Uncaught Error: Call to a member function getType() on null in /mnt/d/www/project-name/vendor/hyperf/server/src/ServerFactory.php:67

初步觉得,是因为控制器有初始化 http 或者其他相关服务,有初始化 Hyperf\Server\ServerFactory::$config ,而命令行没有

阅读源码有点吃力,时间不太充裕,想请教下会的大佬,给些提示

贴上我的代码

<?php

declare(strict_types=1);

namespace App\Command;

use Hyperf\Command\Command as HyperfCommand;
use Hyperf\Command\Annotation\Command;
use Hyperf\WebSocketServer\Sender;

/**
 * @Command
 */
class SendMomentCommand extends HyperfCommand
{
    protected $signature = 'sendMsg';
    protected static $defaultDescription = '发送 socket 消息';

    public function handle()
    {
        $sender = make(Sender::class);

        var_dump(get_class($sender));

        $sender->check(1);
    }
}

详细报错信息

string(29) "Hyperf\WebSocketServer\Sender"
PHP Fatal error:  Uncaught Error: Call to a member function getType() on null in /mnt/d/www/project-name/vendor/hyperf/server/src/ServerFactory.php:67
Stack trace:
#0 /mnt/d/www/project-name/vendor/hyperf/server/src/SwooleServerFactory.php(22): Hyperf\Server\ServerFactory->getServer()
#1 /mnt/d/www/project-name/vendor/hyperf/di/src/Resolver/FactoryResolver.php(56): Hyperf\Server\SwooleServerFactory->__invoke(Object(Hyperf\Di\Container))
#2 /mnt/d/www/project-name/vendor/hyperf/di/src/Resolver/ResolverDispatcher.php(62): Hyperf\Di\Resolver\FactoryResolver->resolve(Object(Hyperf\Di\Definition\FactoryDefinition), Array)
#3 /mnt/d/www/project-name/vendor/hyperf/di/src/Resolver/DepthGuard.php(73): Hyperf\Di\Resolver\ResolverDispatcher->Hyperf\Di\Resolver\{closure}()
#4 /mnt/d/www/project-name/vendor/hyperf/di/src/Resolver/ResolverDispatcher.php(63): Hyperf\Di\Resolver\DepthGuard->call('Swoole\\Server', Object(Closure))
#5 /mnt/d/www/project-name/vendor/hyperf/di/src/Container.php(184): Hyperf\Di\Resolver\ResolverDispatcher-> in /mnt/d/www/project-name/vendor/hyperf/server/src/ServerFactory.php on line 67

Fatal error: Uncaught Error: Call to a member function getType() on null in /mnt/d/www/project-name/vendor/hyperf/server/src/ServerFactory.php:67
Stack trace:
#0 /mnt/d/www/project-name/vendor/hyperf/server/src/SwooleServerFactory.php(22): Hyperf\Server\ServerFactory->getServer()
#1 /mnt/d/www/project-name/vendor/hyperf/di/src/Resolver/FactoryResolver.php(56): Hyperf\Server\SwooleServerFactory->__invoke(Object(Hyperf\Di\Container))
#2 /mnt/d/www/project-name/vendor/hyperf/di/src/Resolver/ResolverDispatcher.php(62): Hyperf\Di\Resolver\FactoryResolver->resolve(Object(Hyperf\Di\Definition\FactoryDefinition), Array)
#3 /mnt/d/www/project-name/vendor/hyperf/di/src/Resolver/DepthGuard.php(73): Hyperf\Di\Resolver\ResolverDispatcher->Hyperf\Di\Resolver\{closure}()
#4 /mnt/d/www/project-name/vendor/hyperf/di/src/Resolver/ResolverDispatcher.php(63): Hyperf\Di\Resolver\DepthGuard->call('Swoole\\Server', Object(Closure))
#5 /mnt/d/www/project-name/vendor/hyperf/di/src/Container.php(184): Hyperf\Di\Resolver\ResolverDispatcher-> in /mnt/d/www/project-name/vendor/hyperf/server/src/ServerFactory.php on line 67
讨论数量: 3
CodingHePing

这个Sender是用websocket推送消息的吧

2年前 评论
浮心 (楼主) 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!