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;
}

posted @ 2025-05-18 23:18  chenqi1231  阅读(159)  评论(0)    收藏  举报