文档地址:Hyperf
路由配置有两种,路由文件和注释。
路由文件使用nikic/fast-route。
composer地址:nikic/fast-route - Packagist
自己写框架也可以使用,比较方便。不过本地写也可以用反射,就是麻烦点。
Hyperf 提供了 @Controller
和 @AutoController
两种注解来定义一个 Controller。
配置文件位置:根目录/config/routes.php。
由
nikic/fast-route提供支持,hyperf/http-server组件接入到hyperf中。
hyperf/http-server中 Hyperf\HttpServer\Router\DispatcherFactory加载根目录/config/routes.php配置文件,
Hyperf\HttpServer\Router\RouteCollector将FastRoute\DataGenerator、FastRoute\RouteParser、server使用Hyperf\HttpServer\MiddlewareManager建立关系。DispatcherFactory中调用RouteCollector设置值,Hyperf\HttpServer\Server调用DispatcherFactory创建路由。
1、可设置内容 : get、post、put、delete、patch、head
2、一个 ’方法名‘
3、多个['方法名','方法名']
1、静态匹配 ’/路径‘
2、动态匹配 ’/路径/{变量名:正则表达式}[/{变量名:正则表达式}]‘ 正则表达式用于验证变量的数据准确,{}为必填,[]为非必填。这种方法设置的变量都是用get获取,get有长度限制。
1、自定义函数 自定义函数的函数名
2、类 类:方法;类@方法;[类:class,方法]
1、get(路由,回调)
2、post(路由,回调)
3、put(路由,回调)
4、delete(路由,回调)
5、path(路由,回调)
6、head(路由,回调)
回调中使用addRoute或者get等,总路由为addGroup路由+回调中的路由
#路由/index/index
Router::addRoute(['Get','post'],'/idnex/index','App\Controller\IndexController@index');
#路由/index/index?id=1&name=qwe
#+ :匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。
Router::addRoute(['Get','post'],'/idnex/index/{id:\d+}/[/{name:\w+}]','App\Controller\IndexController@index');
#路由post /index/test
Router::post('/test','App\Controller\IndexController::test');
#路由post /test/test
#路由get /test/index
Router::addGroup('/test/',function(){
Router::post('test','App\Controller\IndexController::test');
Router::get('index',['App\Controller\IndexController::class','index']);
});
可以直接在任意类上通过定义 @Controller
或 @AutoController
注解来完成一个路由的定义。
@Controller
@Controller
注解用于表明当前类为一个 Controller
类。需配合 @RequestMapping
注解来对请求方法和请求路径进行更详细的定义。
便捷注释:@GetMapping
、@PostMapping
、@PutMapping
、@PatchMapping
、@DeleteMapping。
注释 | 命名空间 |
@Controller |
use Hyperf\HttpServer\Annotation\Controller; |
@RequestMapping |
use Hyperf\HttpServer\Annotation\RequestMapping; |
@GetMapping |
use Hyperf\HttpServer\Annotation\GetMapping; |
@PostMapping |
use Hyperf\HttpServer\Annotation\PostMapping; |
@PutMapping |
use Hyperf\HttpServer\Annotation\PutMapping; |
@PatchMapping |
use Hyperf\HttpServer\Annotation\PatchMapping; |
@DeleteMapping |
use Hyperf\HttpServer\Annotation\DeleteMapping; |
注释参数:
方法 | 参数 | 解释 | 可用值 |
|
methods | 请求方法 | get,post,delete,put,head,patch 可为数组或字符串 |
Mapping |
path | 对应的方法名 | 字符串 |
Controller |
prefix |
路由前缀 | 字符串 |
Controller |
server |
httpserver对应配置文件的server名称 | 字符串 |
Controller |
options |
参数 |
Hyperf\HttpServer\Annotation\Controller和Hyperf\HttpServer\Annotation\Mapping都有继承Hyperf\Di\Annotation\AbstractAnnotation,Hyperf\HttpServer\Annotation下RequestMapping、GetMapping、PostMapping、PutMapping、PatchMapping、DeleteMapping都继承Mapping,不过成员方法$methods值不同,除了RequestMapping可以自己设置其余都是写死。
2、@AutoController
Hyperf\HttpServer\Annotation\AutoController也继承相同层的AbstractAnnotation,参数和Controller类相同。
prefix
表示该 Controller
下的所有方法路由的前缀,默认为类名的小写,如 UserController
则 prefix
默认为 user
,如类内某一方法的 path
为 index
,则最终路由为 /user/index
。
需要注意的是 prefix
并非一直有效,当类内的方法的 path
以 /
开头时,则表明路径从 URI
头部开始定义,也就意味着会忽略 prefix
的值。
server
表示该路由是定义在哪个 Server
之上的,由于 Hyperf
支持同时启动多个 Server
,也就意味着有可能会同时存在多个 HTTP Server
,则在定义路由是可以通过 server
参数来进行区分这个路由是为了哪个 Server
定义的,默认为 http
。
通过方法参数获取,或者方法中注入use Hyperf\HttpServer\Contract\RequestInterface类的route、get、post方法。
declare(strict_types=1);
namespace App\Controller;
use Hyperf\HttpServer\Contract\RequestInterface;
use Hyperf\HttpServer\Annotation\AutoController;
/**
* @AutoController()
*/
class UserController
{
#路由:/user/index/{id:\d+}
public function index(RequestInterface $request)
{
$id = $request->input('id', 1);
return (string)$id;
}
}
declare(strict_types=1);
namespace App\Controller;
use Hyperf\HttpServer\Contract\RequestInterface;
use Hyperf\HttpServer\Annotation\Controller;
use Hyperf\HttpServer\Annotation\RequestMapping;
use Hyperf\HttpServer\Annotation\PostMapping;
/**
* @Controller()
*/
class UserController
{
/**
* @RequestMapping(path="index", methods="get,post")
*/
#路由:/user/index/{id:\d+}
public function index(int $id)
{
var_dump($id)
}
/**
* @PostMapping(path="index2")
*/
#路由:/user/index2/{user}
public function test2(string $user)
{
$method = $this->request->getMethod();
return [
'method' => $method,
'message' => "Hello {$user}.",
];
}
}
注意事项:
因为是根据注释配置路由,可能会因为错误编写导致解析失败。
查询失败方法:php bin/hyperf.php describe:routes
有错误会显示错误信息。
解析失败之后的控制器中的路由会不解析,所以解析设置无效,应先检查是否有异常报错。
php自带的反射类中,包括类的反射和方法的反射等,都可以获取对应注释,自己写的话应该可以通过正则出数据让后自己做处理。
根据注释可以直接生成api,比如composer仓库里的hg/apidoc。
composer地址:hg/apidoc - Packagist
根据文档显示 hyperf中也有使用hg/apidoc。