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。

注释命名空间
@Controlleruse Hyperf\HttpServer\Annotation\Controller;
@RequestMappinguse Hyperf\HttpServer\Annotation\RequestMapping;
@GetMappinguse Hyperf\HttpServer\Annotation\GetMapping;
@PostMappinguse Hyperf\HttpServer\Annotation\PostMapping;
@PutMappinguse Hyperf\HttpServer\Annotation\PutMapping;
@PatchMappinguse Hyperf\HttpServer\Annotation\PatchMapping;
@DeleteMappinguse Hyperf\HttpServer\Annotation\DeleteMapping;

注释参数:

方法参数解释可用值

Mapping

methods请求方法

get,post,delete,put,head,patch

可为数组或字符串

Mappingpath对应的方法名字符串
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。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在 React 中,使用 React Router 可以轻松地创建路由。下面是一个简单的示例来说明如何创建路由: 首先,确保你已经安装了 React Router 库。可以使用以下命令来安装: ``` npm install react-router-dom ``` 接下来,在你的应用程序中导入所需的模块: ```jsx import React from 'react'; import { BrowserRouter as Router, Route, Switch, Link } from 'react-router-dom'; ``` 然后,在你的组件中定义路由。下面是一个示例: ```jsx function App() { return ( <Router> <div> <nav> <ul> <li> <Link to="/">Home</Link> </li> <li> <Link to="/about">About</Link> </li> <li> <Link to="/dashboard">Dashboard</Link> </li> </ul> </nav> <Switch> <Route path="/" exact component={Home} /> <Route path="/about" component={About} /> <Route path="/dashboard" component={Dashboard} /> </Switch> </div> </Router> ); } function Home() { return <h2>Home</h2>; } function About() { return <h2>About</h2>; } function Dashboard() { return ( <div> <h2>Dashboard</h2> <Switch> <Route path="/dashboard/profile" component={Profile} /> <Route path="/dashboard/settings" component={Settings} /> </Switch> </div> ); } function Profile() { return <h3>Profile</h3>; } function Settings() { return <h3>Settings</h3>; } ``` 在上面的示例中,我们创建了一个 `Router` 组件,并在其中定义了导航菜单和路由规则。`Route` 组件用来定义路径和组件的映射关系。`Switch` 组件用来保证只有一个路由匹配成功。 在 `Dashboard` 组件中,我们创建了另一个嵌套的 `Switch` 组件,以支持路由。在这个嵌套的 `Switch` 中,我们定义了 `/dashboard/profile` 和 `/dashboard/settings` 这两个路径与对应的组件的映射关系。 最后,将 `App` 组件渲染到 DOM 中: ```jsx ReactDOM.render(<App />, document.getElementById('root')); ``` 通过以上代码,你就可以在你的应用程序中创建路由了。在导航菜单中点击链接将会渲染相应的组件。例如,点击 `/dashboard` 将会显示 `Dashboard` 组件,点击 `/dashboard/profile` 将会显示 `Profile` 组件。 希望这个示例能帮助你理解如何在 React 中创建路由。如有其他问题,请随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lsswear

感谢大佬打赏 q(≧▽≦q)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值