hyperf 二、路由

文档地址: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、fast-route路由定义

1.1 方法:addRoute(请求方法,路由,回调)

请求方法

1、可设置内容 : get、post、put、delete、patch、head

2、一个 ’方法名‘

3、多个['方法名','方法名']

路由

1、静态匹配 ’/路径‘

2、动态匹配 ’/路径/{变量名:正则表达式}[/{变量名:正则表达式}]‘ 正则表达式用于验证变量的数据准确,{}为必填,[]为非必填。这种方法设置的变量都是用get获取,get有长度限制。

回调

1、自定义函数 自定义函数的函数名

2、类 类:方法;类@方法;[类:class,方法]

1.2 与方法名一致

1、get(路由,回调)

2、post(路由,回调)

3、put(路由,回调)

4、delete(路由,回调)

5、path(路由,回调)

6、head(路由,回调)

1.3 addGroup(路由,回调)

回调中使用addRoute或者get等,总路由为addGroup路由+回调中的路由

2、 代码示例

#路由/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 注解来完成一个路由的定义。

1、 @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;

注释参数:

方法 参数 解释 可用值

Mapping

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 下的所有方法路由的前缀,默认为类名的小写,如 UserControllerprefix 默认为 user,如类内某一方法的 pathindex,则最终路由为 /user/index
需要注意的是 prefix 并非一直有效,当类内的方法的 path/ 开头时,则表明路径从 URI 头部开始定义,也就意味着会忽略 prefix 的值。

server 表示该路由是定义在哪个 Server 之上的,由于 Hyperf 支持同时启动多个 Server,也就意味着有可能会同时存在多个 HTTP Server,则在定义路由是可以通过 server 参数来进行区分这个路由是为了哪个 Server 定义的,默认为 http

3、 路由参数

通过方法参数获取,或者方法中注入use Hyperf\HttpServer\Contract\RequestInterface类的route、get、post方法。

4、 代码示例

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。

你可能感兴趣的:(php,学习,php)