Yii2 支持以下几种路由格式:
```php
/index.php?r=post%2Fview&id=100
/index.php/post/100
/posts/100
```
其中第一个是Yii2默认的路由格式,后面两个需要开启路由美化之后,才能使用的。
下面将详细介绍美化后,怎么设置具体的路由规则。
### 概括
1、URL路由管理器
2、开启美化URL格式
3、路由处理
4、自定义URL格式规则
5、默认路由、缺省路由
6、关于Controller和Action命名匹配路由
------------
#### 1、URL路由管理器
URL管理器提供两种URL格式:
##### 1.1 默认URL格式
默认URL格式使用一个参数r表示路由, 并且使用一般的参数格式表示请求参数。
例如,/index.php?r=post/view&id=100表示路由为post/view,参数id为100。
##### 1.2 美化URL格式
美化URL格式在脚本名称后面使用更多的路径信息表示路由和参数信息。
例如,用适当的URL规则,/index.php/post/100 中附加的路径信息/post/100表示 路由为post/view,参数id为100。
#### 2、开启美化URL格式
##### 2.1 配置文件components节点配置
找到配置文件,高级版Yii2一般在 backend或者frontend目录下面的config目录的main.php文件中
```php
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
],
],
```
components配置的urlManager 需要开启 美化URL
enablePrettyUrl设置为true即可
#### 3、路由处理
路由处理包含两个步骤:
请求被解析成一个路由和关联的参数;
路由相关的一个控制器动作被创建出来处理这个请求。
##### 3.1 默认URL
例如,/index.php?r=post/view
将会由控制器 PostController这个类下面的 actionView() 方法执行处理 这个请求。
##### 3.2 美化URL
例如,/post/view
将会由控制器 PostController这个类下面的 actionView() 方法执行处理 这个请求。
如果找不到任何匹配的规则,系统将抛出yii\web\NotFoundHttpException异常。
#### 4、自定义URL格式规则
##### 4.1 用正则匹配方式重定向到相应路由
```php
'rules' => [
'y//?' => 'test/index',
'a' => 'test/index',
'a/' => 'test/index',
],
```
解析:
第一个是 匹配 请求 /y/2000/abc 时候,会交给 test/index处理,即交给 TestController类下的actionIndex
第二个是 匹配 请求 /a
第三个是 匹配 请求 /a/123
其中 year、id、category为请求参数,可以在actionIndex方法中,使用Yii::$app->request->get('year')等获取相应的值
##### 4.2 指定controller和action
```php
'rules' => [
'/aaa' => '/index',
'/' => '/index',
'//' => '/',
's' => '/index',
],
```
解析:
第一个 匹配 /post/aaa 或者 /test/aaa 会指向 PostController或者TestController类的actionIndex()方法进行处理 请求;
第二个 匹配 /test/123 会指向 TestController类下面的actionIndex()方法;
第三个 匹配 /post/123 或者 /comment/123 会指向 CommentController类或者PostController类下面的 actionUpdate 或者 actionDelete方法进行处理请求;
第四个 匹配 /posts 或者 comments 会指向 PostController 或者 CommentController 类的actionIndex方法进行处理。
##### 4.3 http方法 规则
```php
'rules' => [
'PUT,POST post/' => 'post/update',
'DELETE post/' => 'post/delete'
'post/' => 'post/view',
],
```
解析:
第一个,支持匹配 PUT或者POST请求 /post/123 时候,会交给 PostController类下的 actionUpdate()方法进行处理;
第二个,支持匹配 DELETE请求 /post/123 时候,交给 PostController类下的actionDelete()方法进行处理;
第三个,支持匹配 GET请求等 /post/123 时候,交给 PostController类下的actionView()方法进行处理。
#### 5、默认路由、缺省路由
默认路由即 当直接请求 Yii2设置的基础域名URL时候 所 指向的路由;
比如,Yii2 项目:http://www.test.com
即请求这个URL时候,默认用于处理的路由
我们一般在配置文件的defaultRoute节点配置:
![](https://blog-1252087744.cos.ap-guangzhou.myqcloud.com/2019-04/Yii2%20%E8%B7%AF%E7%94%B1%E5%9F%BA%E6%9C%AC%E9%85%8D%E7%BD%AE/1.jpg)
'defaultRoute' => 'main/index' //解析
即 请求 http://www.test.com 时,会交给MainController这个类下面的actionIndex()方法进行处理
#### 6、关于Controller和Action命名匹配路由
在PHP开发中,我们的命名规范一般是驼峰式的名词组成类名或者方法名;
在Yii2中,Controller的命名规范一般是 名词大写字母开头+Controller结合;
例如:UserController、UserNameController
action方法的命名一般是 action+名词大写字母开头结合;
例如:actionAdd、actionEditName
对于和Controller或者action结合的名词,有单个名词或组合名词(组合名词即 UserName这种两个大写字母开头组合的)。
这种情况下的路由是这样子的:
比如,UserNameController类下的actionEditName() 方法处理的路由是
```php
/user-name/edit-name
```
------------
### 总结
1、URL路由管理器
2、开启美化URL格式
3、路由处理
4、自定义URL格式规则
5、默认路由、缺省路由
6、关于Controller和Action命名匹配路由
------------
the End.