swoole-worker
swoole-worker copied to clipboard
请问下worker中如何实现类似controller这样的结构
看了官网的demo,所有的业务逻辑都是写在worker.php里面,这样会导致业务逻辑很复杂,我想的是能不能我自己实现一个logic逻辑来处理不同的业务,在里面可以使用worker启动时候初始化的redis和db连接,而不是重复实例化。
对了,如果作者还在的话,能不能加我qq:2335563089
看了官网的demo,所有的业务逻辑都是写在worker.php里面,这样会导致业务逻辑很复杂,我想的是能不能我自己实现一个logic逻辑来处理不同的业务,在里面可以使用worker启动时候初始化的redis和db连接,而不是重复实例化。
大致方法如下,在onworkerstart里面初始化所有事件
在onrecive里面根据数据解析得到事件名,然后执行。
配置里面的自动重载目录加上 events 目录
代码没验证
worker.php
<?php
declare(strict_types=1);
use Xielei\Swoole\Helper\WorkerEvent as HelperWorkerEvent;
class WorkerEvent extends HelperWorkerEvent
{
private $events = [];
public function onWorkerStart()
{
$events = [];
foreach (glob(__DIR__ . '/events/*.php') as $file) {
$name = basename($file, '.php');
$events[$name] = require $file;
}
$this->events = $events;
}
public function onReceive(string $client, array $session, string $data)
{
$event = self::getEventFromBuff($data);
call_user_func($this->events[$event], $client, $session, $data, $this);
}
public static function getEventFromBuff($data): string
{
return '...';
}
}
事件方法
<?php
// 返回一个function
return function (string $client, array $session, string $buff, $worker) {
// todo..
};
相当于把redis对象传入方法中提供调用,这样代码感觉比较难管理,如果能提供依赖注入或者全局this对象方式获取就更好了。还有就是task也有点不方便,如果我想在task里面执行redis或者db操作,还是一样要传入这个连接对象。