Hyperf框架-路由与注解
路由
路由有http路由和grpc路由,Hyperf的http路由由 nikic/fast-route 提供支持,并由 hyperf/http-server 组件负责接入到 Hyperf 中,RPC 路由由对应的 hyperf/rpc-server 组件负责
HTTP路由
主要有配置文件和注解两种定义路由的方式
1.配置文件
在config/routes.php里定义路由配置
use Hyperf\HttpServer\Router\Router;
//多个请求方式
Router::addRoute(['GET', 'POST', 'HEAD'], '/', 'App\Controller\Admin\AuthController@index');
//闭包返回
Router::get('/index.ico', function () {
return '/index.ico';
});
//加上中间件
Router::get('/admin', 'App\Controller\AdminController@index')
->addMiddleware(\App\Middleware\AuthAdminMiddleware::class);
//路由组
Router::addGroup('/user/',function (){
Router::get('index','App\Controller\UserController@index');
Router::post('store','App\Controller\UserController@store');
Router::get('update','App\Controller\UserController@update');
Router::post('delete','App\Controller\UserController@delete');
});
//设置路由参数
Router::get('/user/{id}', 'App\Controller\UserController::info');
2.注解
Hyperf框架在启动时会扫描代码文件,解析代码文件里面的注解,收集到Hyperf\Di\Annotation\AnnotationCollector
类供应用程序使用
在任意类上通过定义 @Controller 或 @AutoController 注解来完成一个路由的定义,驼峰命名的控制器,会自动转化为蛇形路由
- 通过在类上定义@AutoController注解,就会自动生成类名/方法名的路由
- @Controller(prefix="/user") 在类上用prefix自定义路由前缀
- @RequestMapping(path="index", methods="get,post") 可在方法上更加详细的自定义路由
GRPC路由
Hyperf 使用 grpc-server 来处理 gRPC 请求,不需要像 HTTP 那样定义路由。gRPC 客户端会根据 proto 文件中的服务定义自动连接到正确的服务
需要安装依赖 :
- composer require hyperf/grpc-server
- composer require hyperf/grpc-client
1.使用 protoc 自动生成代码
protoc --php_out=grpc/ grpc.proto
2.grpc server服务
需要在 config/autoload/server.php 中添加 gRPC 服务器配置以及路由
'servers' => [
....
[
'name' => 'grpc',
'type' => Server::SERVER_HTTP,
'host' => '0.0.0.0',
'port' => 9503,
'sock_type' => SWOOLE_SOCK_TCP,
'callbacks' => [
Event::ON_REQUEST => [\Hyperf\GrpcServer\Server::class, 'onRequest'],
],
],
],
//路由
Router::addServer('grpc', function () {
Router::addGroup('/grpc.hi', function () {
Router::post('/sayHello', 'App\Controller\HiController@sayHello');
});
});
//也可以使用@GrpcService注解
3.gRPC client 服务
示例
public function hello()
{
// 这个client是协程安全的,可以复用
$client = new \App\Grpc\HiClient('127.0.0.1:9503', [
'credentials' => null,
]);
$request = new \Grpc\HiUser();
$request->setName('hyperf');
$request->setSex(1);
/**
* @var \Grpc\HiReply $reply
*/
list($reply, $status) = $client->sayHello($request);
$message = $reply->getMessage();
$user = $reply->getUser();
var_dump(memory_get_usage(true));
return $message;
}