# URL和路由
[TOC]
## 访问方式
1. 带参数访问`m`为模块`c`为控制器`a`为操作,不分大小写
2. 伪静态情况下`/index/index/index` 会被解析为index模块index控制器index操作,
>如果只有两个字段的情况如下` /index/index`,且当前访问的域名已经绑定啦模块,则解析为 **绑定的模块/控制器/方法**,如果没有绑定模块则为解析为**模块/控制器/默认操作方法**
## URL生成
生成的样式跟配置的模式有关
``` php
//0正常的参数方式
//1模块控制器操作使用路径方式,
//参数使用正常参数方式 如 http://www.xxx.com/index/index/index.html?a=b&b=c
'url_model' => 0,
```
使用助手函数url方法生成,生成的样式和url模式有关,如下(注意大小写)
``` php
//生成url
url('Menu/list');//m=admin&c=menu&a=list
//控制器分层生成
url('sys.UserGroup/add');//m=admin&c=user_group&a=add
//生成指定模块下的方法
url('/index/Article/list') ;//m=index&c=article&a=list
```
## 域名绑定模块
域名映射到对应的模块,此设置可以省去url中的模块名字
``` php
'domain_map' => [
// 'ank.loc' => 'admin',
// 'ank.dbg' => 'admin',
'api.ank.loc' => 'api',
'api.ank.dbg' => 'api',
],
```
## 路由配置
伪静态的时候使用url路由功能
``` php
'url_route' => [
// 路由规则为整个字符串的完全匹配
// 路由规则参数格式为 :参数名,影射到 模块/控制器/操作(三个都不能少)
// 只要当前或生成的url符合后面的操作方法路径就可以匹配转换
// 键中没有标记出来的参数会在后面加?a=1&b=2这样的格式
'news/:id' => 'admin/index/index',
//下面是两种方法
'sajax/:action' => 'admin/sys.ajax/index',
'sajax/:action/:menu_id' => 'admin/sys.ajax/index',
],
```
url在生成时会自动转换成路由中对应的规则,如上所示
``` php
url('/admin/sys.ajax/index',['id'=>3]);
//生成后的url为 /sajax/3.html
```
路由生成时从上往下匹配,只要有一个匹配就结束匹配
## 路由配置文件
此文件是为啦把路由配置单独放一块
``` php
/**
* 路由规则为从上到下匹配,匹配规则有两种
* 正则:以 /开头的规则一定要是完整的正则表达式,这种模式生成url时不会自动转换
* 冒号字符串: 以这种规则匹配的地址,生成url时自动替换参数到对应规则的url中
*/
return [
'/\/.*/' => function ($request) {
return 'hellow world';
},
'/static/' => function ($request) {
return 'static';
},
'article/:article_id' => '/index/Article/detail',
//下面是两种方法
'cat/:fenlei' => '/index/Article/index',
'flag/:flag' => '/index/Article/index',
'p/:p' => '/index/Index/index',
'tag/:tag_id' => '/index/Article/taglist',
'help' => '/index/service/index',
'color/tiaose' => '/index/Tool/tiaose',
'format/index' => '/index/Tool/css',
'sajax/:action/:menu_id' => '/admin/sys.Ajax/index',
];
```
路由中如果直接返回Response实例则会直接响应,如果返回的是字符串则会自动创建Response响应