Loading

php Hyperf框架如何通过路由文件注册路由?

 在 Hyperf 里,「注解路由」「routes.php 文件路由」是两条完全独立的注册通道:

  • 注解由框架启动时扫描类产生不写任何 routes.php 代码即可生效

  • routes.php手动写 \Hyperf\HttpServer\Router\Router静态方法与注解无关,但可以和注解共存

下面把「routes 文件」里如何手写 GET / POST / PUT / DELETE / PATCH 一次讲透,并给出与注解混用的最佳实践。

一、routes.php 文件位置

config/routes.php          // 默认全局文件
config/autoload/routes.php // 你也可以自己新建,会被自动 include

二、5 种动词的专用写法(推荐)

<?php
declare(strict_types=1);

use Hyperf\HttpServer\Router\Router;

/* 1. GET */
Router::get('/book/{id}', 'App\Controller\BookController@show');

/* 2. POST */
Router::post('/book', 'App\Controller\BookController@create');

/* 3. PUT */
Router::put('/book/{id}', 'App\Controller\BookController@replace');

/* 4. PATCH */
Router::patch('/book/{id}', 'App\Controller\BookController@partialUpdate');

/* 5. DELETE */
Router::delete('/book/{id}', 'App\Controller\BookController@destroy');

三、批量注册(路由组 + 多动词)

Router::addGroup('/api/v1', function () {
    Router::get('book', 'App\Controller\BookController@index');
    Router::post('book', 'App\Controller\BookController@store');
    Router::put('book/{id}', 'App\Controller\BookController@update');
    Router::patch('book/{id}', 'App\Controller\BookController@patch');
    Router::delete('book/{id}', 'App\Controller\BookController@delete');
});

四、一条路由同时支持多种动词

Router::addRoute(['GET', 'POST', 'PUT', 'DELETE', 'PATCH'],
                 '/multi',
                 'App\Controller\DemoController@handle');

五、中间件、参数约束、命名路由(文件路由独享)

Router::get('user/{id:\d+}', 'UserController@show')
      ->addMiddleware(\App\Middleware\SignMiddleware::class)
      ->setName('user.show');   // 生成 URL 时用 route('user.show')

六、与「注解路由」混用注意事项

  1. 两者互不冲突,最终路由表 = 文件路由 ∪ 注解路由

  2. 如果 path 相同且 method 也相同,后注册的被忽略(框架会报警告);

  3. 生产环境建议 二选一

    • 快速 CRUD用注解

    • 需要集中管理、动态生成、版本号分组 用文件路由

  4. 调试命令统一用【查看路由列表】:

    php bin/hyperf.php describe:routes

    可看到 Origin=AnnotationOrigin=Config 来区分来源。

七、一张速查表

动词 文件写法(最简洁) 对应注解写法(类里)
GET Router::get($uri,$callback) #[GetMapping(path:"..")]
POST Router::post($uri,$callback) #[PostMapping(path:"..")]
PUT Router::put($uri,$callback) #[PutMapping(path:"..")]
PATCH Router::patch($uri,$callback) #[PatchMapping(path:"..")]
DELETE Router::delete($uri,$callback) #[DeleteMapping(path:"..")]

结论

想在 routes.php 里手写 GETPOSTPUTDELETEPATCH 仅需记住:

  • 动词专用方法(Router::get/post/put/patch/delete

  • 或用 Router::addRoute([...], $uri, $ctrl) 一次多个动词

  • 支持路由组、中间件、参数正则、命名路由,功能与注解互补,按需选择即可 。

posted @ 2025-09-26 11:47  Carvers  阅读(20)  评论(0)    收藏  举报