将Web中的中间件、路由、请求参数验证等概念集成到WorkerMan中,使得处理IM消息就像编写Web控制器一样简单
composer require dean/routeway-worker
发布配置文件
php artisan vendor:public --tag routeway
将生成路由配置文件routes/routeway.php
和websocker配置文件config/routeway.php
启动Workerman
php artisan workerman start --d
停止Workerman
php artisan workerman stop --d
其中--d
参数表示后台运行服务器,可以不添加
客户端和服务器通讯使用JSON格式传输数据,包含type
和data
2个字段:
{
"type": "your message type string",
"data": {
...
}
}
- type表示该数据包的类型,值为字符串类型,比如:
"login"
(登录),"chat"
(聊天)等,需要开发者自定义; - data表示该数据包的主体内容,值为数组或对象;
假设服务器收到的消息内容如下:
{
"type": "hi",
"data": {}
}
使用闭包方式处理hi消息
routes/routeway.php
$router = app(Dean\RoutewayWorker\Routing\Router::class);
// 使用register方法注册hi消息的处理
$router->register('hi',function (SocketRequest $request)
{
// 生成回复内容
$res = make_response('hi',['message'=>'Hello World']);
// 回复客户端
\GatewayWorker\Lib\Gateway::sendToCurrentClient($res);
});
服务器将发送以下内容至客户端:
{
"type": "hi",
"data": {
"message": "Hello World"
}
}
执行以下命令会在app\Handlers\目录下生成消息处理器LoginHandler
php artisan make:handler LoginHandler
然后在routes/routeway.php,添加如下内容:
$router = app(Dean\RoutewayWorker\Routing\Router::class);
// 使用register方法注册login消息的处理
$router->register('login', 'App\Handlers\LoginHandler');
使用中间件方式
$router = app(Dean\RoutewayWorker\Routing\Router::class);
$router->group([
'middleware' => App\Socket\Middleware\AnyMiddleware::class
],function($router){
$router->register('login', 'App\Handlers\LoginHandler');
});
// 或者
$router->register('login', 'App\Handlers\LoginHandler')->middleware(App\Socket\Middleware\AnyMiddleware::class)
假设服务器收到的login完整的消息内容如下:
{
"type": "login",
"data":
{
"username": "[email protected]",
"password": "123456"
}
}
下面我们将读出username和password的值
app\Handlers\LoginHandler.php
namespace App\Handlers\LoginHandler;
use App\Requests\Socket\LoginRequest;
user App\User;
class LoginHandler
{
// $user参数自动注入
public function handler(LoginRequest $request,User $user)
{
$username = $request->username; // [email protected]
$password = $request->password; // 123456
// 登录逻辑
...
}
}
handler方法中的User $user
参数将会自动注入,而LoginRequest $request
用于验证消息体data内的参数格式是否正确
app\Requests\Socket\LoginRequest.php
namespace App\Requests\Socket\LoginRequest;
use Dean\RoutewayWorker\Requests\SocketRequest;
public class LoginRequest extends SocketRequest
{
public function rules()
{
return [
'username' => 'required|email',
'password' => 'required|min:6'
];
}
public function messages()
{
return [
'username.required' => '用户名必填',
'username.email' => '电子邮箱格式不正确',
...
];
}
public function attributes()
{
return [
'username' => '用户名',
'password' => '密码',
];
}
}
function make_response(string $type, $data = [], TransformerAbstract $transformer = null, $include = null)
- $type: 自定义消息类型,如“login"
- $data: 消息数据体,可以是一个数组或者Model
- $transformer: 如果$data为Model时模型转json的转换器,参照这里
- $include: 当使用$data为Model时$transformer额外包含的关联数据,参照这里
function response_error(int $client_id, string $msg, $code = 422)
- $client_id:客户端id
- $msg: 错误消息内容
- $code: 错误代码