如何在 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
这个Sender是用websocket推送消息的吧