# 路由

框架自带的路由组件,支持按url映射到文件的方式来执行相应的控制器,也支持定义路由路由配置。

为什么还保留url映射路径的方式这个主要是业务场景决定的,很多的业务一运行就是10年以上,可能有几千、几万的url。全采用配置式的话,对于后期接手开发的人来说,时间长了配置文件的管理是个大问题。 而采用注解反射的话、文件数量大了对于php-fpm运行方式,性能损失过大。

TIP

除了框架自带的路由组件外也封装了FastRoute服务。有需要的话直接修改入口文件中相应的配置

框架默认的路由组件是按url映射到文件的方式来执行相应的控制器,但是有一些情况下我们需要简短而优雅的网址便于用户记忆及SEO。这时候就需要使用url路由或者使用第三方的路由的服务。

配置章节我们介绍过,在Config目录下有route.php配置文件,我们的所有路由都配置在这个文件里,下面介绍方法及规则

# 路由pattern规则定义

TIP

(第三方的路由请参考相对应的文档)

如我们配置了一条路由

\Cml\Route::get('list/:id\d' => [\web\Controller\Blog\ArticleController::class, 'show']);

这条路由的意思为 当用户以GET请求访问 http://域名/list/1.html 这样的地址时,框架会执行web/Controller/Blog/ArticleController::show方法 :id意思为它是一个动态参数,\d为强制匹配数字。

在控制器中可使用如下方法接收参数。

  • $this->request->getInt('id') (需要开启中间件支持use MiddlewareControllerTrait)
  • \Cml\Http\Input::getInt('id')

在模板中可以使用 {{url "list/{$id}"}} 生成相应的url

如果:id\d这条规则不加\d则不强制判断是否为数字参数比如`:title 则可用如下方法接收参数:

$this->request->getString('title') (需要开启中间件支持use MiddlewareControllerTrait) \Cml\Http\Input::getString('title')

# 路由相关方法

<?php

//应用路由配置文件

use Cml\Route;

Route::get('blog/bb/:aid\d', [\web\Controller\Blog\ArticleController::class, 'show']);

Route::post('blog/bb/:aid\d', [\web\Controller\Blog\ArticleController::class, 'show']);

Route::put('blog/bb/:aid\d', [\web\Controller\Blog\ArticleController::class, 'show']);

Route::delete('blog/bb/:aid\d', [\web\Controller\Blog\ArticleController::class, 'show']);

Route::patch('blog/bb/:aid\d', [\web\Controller\Blog\ArticleController::class, 'show']);

Route::any('blog/bb/:aid\d', [\web\Controller\Blog\ArticleController::class, 'show']);

/**
 * RESTful 路由
 *
 * get 请求对应 web/Blog/Article/getShow
 * post 请求对应 web/Blog/Article/postShow
 * delete 请求对应 web/Blog/Article/deleteShow
 * put 请求对应 web/Blog/Article/putShow
 * patch 请求对应 web/Blog/Article/patchShow
 */
Route::rest('pattern' , [\web\Controller\Blog\ArticleController::class, 'show']);

Route::any('blog/bb/:aid\d', [\web\Controller\Blog\ArticleController::class, 'show']);

# 分组路由

use Cml\Route;

Route::group('v1', function() {

    Route::get('user/add', [\web\Controller\Blog\ArticleController::class, 'show']);

    Route::get('user/edit', [\web\Controller\Blog\ArticleController::class, 'show']);

});

这边定义了 v1分组,即匹配 v1/user/add以及v1/user/edit这两个url

# 多应用单独定义路由

默认情况我们的路由是定义在全局projxx/Config/route.php中。但是如果我们有多个应用。

比如有webadminapi三个应用,然后我们想在web中定义自己的路由。这时候可以在web/Config/route.php中定义web独立的路由。然后在projxxx/Config/route.php中使用 Route::loadAppRoute('web'); 将其载入即可。

# 配置路由中间件

在控制器中使用use MiddlewareControllerTrait,控制器即可支持中间件。中间件的具体使用参考中间件相关章节。这边说明针对单个路由的中间件配置。

Route::get('blog/bb/:aid\d', [\web\Controller\Blog\ArticleController::class, 'show'], [
      \Cml\Middleware\CorsMiddleware::class
]);

或

Route::group('v1', function() {
    Route::get('user/edit', [\web\Controller\Blog\ArticleController::class, 'show']);
}, [
        \Cml\Middleware\CorsMiddleware::class
]);

通过第三个参数传入要使用的中间件数组即可。 优先级为:

全局中间件 => 针对app的中间件 => 针对控制器的中间件 => config文件中配置的针对action的中间件 => Route::group中配置的中间件 => Route::方法 配置的中间件