NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
`ExpressPHP` 在路由配置文件 `application/route.php` 进行路由注册。 ## 注册路由规则 引入命名空间 ~~~ use sys\Route; ~~~ 注册路由规则 >[info] Route::rule('路由表达式', '路由地址'); ## 路由表达式 路由表达式是正则表达式的一部分,最终都会被 `Route` 转化为正则,例如: ~~~ Route::rule('news/forum/:name', '\app\controller\News->forum'); ~~~ 上面的路由表达式 `news/forum/:name` 将转化为: ~~~ `^news/forum/([\w-]+)` ~~~ 根据正则表达式,路由表达式 `news/forum/:name` 能匹配下面的URL: ~~~ http://localhost/news/forum/10001 http://localhost/news/forum/v10001 http://localhost/news/forum/v-10001 ~~~ ### [ 变量 ] ` :name` 是一个变量,你可以随意命名,变量是可以定义规则的,没有定义规则的变量默认为 `[\w-]+`,变量所在URL段如果匹配成功,匹配的值将保存下来,可以通过 `Request` 类访问到,详情可查看请求类的文档。 ~~~ use sys\Request; echo Request::route('name'); ~~~ >[success] 变量还可以在 **路由地址** 中使用 ## 路由地址 路由地址 = 命名空间(目录 + 类名) + 方法名,例如: ~~~ Route::rule('news/forum/:name', '\app\controller\News->forum'); ~~~ 上面的路由地址 `\app\controller\News->forum` 分为三部分: 第一部分:目录 ~~~ \app\controller\ ~~~ 第二部分:类名 ~~~ News ~~~ 第三部分:方法名 ~~~ ->forum ~~~ ### [ 变量 ] 路由地址也能使用变量,但是只能在 **绑定方法模式** 中使用 >[warning] 请不要在路由地址的 **类名** 部分使用变量。 ## 绑定方法模式 `ExpressPHP` 为了提高性能与效率,开发了该模式,只需注册一条路由规则,绑定的控制器下的所有方法都可在URL中访问,使用方式如下: ~~~ Route::rule('api/news/:method', '\app\controller\News\:method', Route::BIND_METHOD); ~~~ 能匹配下面的URL: ~~~ http://localhost/api/news 路由至 app\webapi\controller\News->index() http://localhost/api/news/ 路由至 app\webapi\controller\News->index() http://localhost/api/news/article 路由至 app\webapi\controller\News->article() http://localhost/api/news/edit_id 路由至 app\webapi\controller\News->editId() ~~~ 变量使用在方法名部分时,例如: ~~~ \app\controller\News\:method ~~~ 下划线分割命名会自动转换为驼峰命名,例如: ~~~ http://localhost/api/news/edit_id 路由至 app\webapi\controller\News->editId() ~~~ 使用在目录部分时,不会转换,例如下面的 `:v` 变量: ~~~ Route::rule(':v/news/:method', '\app\:v\controller\News\:method', Route::BIND_METHOD); ~~~ ## 完全匹配 规则匹配检测的时候只是对URL从头开始匹配,只要URL地址包含了定义的路由规则就会匹配成功,如果希望完全匹配,可以在路由表达式最后使用$符号,例如: ~~~ Route::rule('news/article/:id$', 'webpage/controller/News/article'); ~~~ 下面的URL会匹配成功 ~~~ http://localhost/api/news/article/10010 ~~~ 下面的URL会匹配失败 ~~~ http://localhost/api/news/article/10010/2 ~~~ ## URL目录 有些URL是一个目录,例如: ~~~ http://localhost/news http://localhost/news/ ~~~ 这样的URL在定义路由表达式时,需要以 `/*$` 结尾,例如: ~~~ Route::rule('news/*$', 'webpage/controller/News/index'); ~~~ ## 首页 配置首页路由如下: ~~~ Route::rule('/*$', '\app\controller\Index->index'); ~~~ >[warning] 请不要在首页使用 **绑定方法模式** 。 为什么不能使用绑定方法模式?因为首页在所有框架设计中都比较特殊,首页会与URL目录生产歧义,比如: ~~~ http://localhost/news ~~~ 到底要指向 Index 控制器的 news 方法,还是指向 news 控制器的 index 方法呢?所有框架都选择了后者,所以 ExpressPHP 不能在首页使用绑定方法模式。