去年写过一篇关于
yii2-router
的博文,当时完全参照yii2
官网去写,结果可想而知,没人能看懂,包括我自己。今天偶然翻起,所以决定删了旧的,再重新整理一次
一、 路由的概念
首先梳理一下GET
请求与相应的简单过程(针对php
后端):①客户端发出GET
请求(URL
);②后端服务器根据 URL
, 检查指定请求是一个静态文件(请求的文件真实存在于服务端),那么直接返回该文件,如果请求的文件不存在,那么就需要用到路由
,根据路由规则来确定怎么处理请求,怎么查询数据库,怎么生成页面;③将上步生成的页面返回给客户端。由此可见,路由的作用其实就是分发请求。如果没理解也没关系,继续向下看。
关于上述第②步中 “怎么处理请求”、“怎么查询数据库”、“怎么生成页面”,实际就是典型的
MVC
结构;M
指数据库模型,V
视图,也就是怎么生成页面,C
控制器。在MVC
中,控制器整合业务流(或者说是数据流)的处理流程,视图 和 模型 主要起辅助作用。所以也就是说,路由
的作用就是为了找到URL
请求对应的控制器
,并解析出URL
请求参数给控制器,最后控制器负责处理客户端请求。
一个网站,一般会都会留有两个后端入口,
index.php
和admin.php
,index.php
供浏览者访问,另一个供站长做后台管理。有人问,必须留两个吗?答案自然是否定的,留多少都成,哪怕一个请求一个接口,但是为了网站容易管理,一般都是留两个。
二、 yii2
配置
我的 yii2
项目结构如下截图:
其它文件都已删除,关于 router
的例子,只需要修改 config/web.php
即可满足,以下是每个文件的内容
1.config/web.php
<?php$config = ['id' => 'demo','basePath' => dirname(__DIR__),'language' => 'zh-cn','aliases' => ['@bower' => '@vendor/bower-asset','@npm' => '@vendor/npm-asset',],'components' => ['errorHandler' => ['errorAction' => 'site/error',],'log' => ['traceLevel' => YII_DEBUG ? 3 : 0,'targets' => [['class' => 'yii\log\FileTarget','levels' => ['error', 'warning'],],],],/* url 管理器 */'urlManager' => [
// 'enablePrettyUrl' => true, // 美化 url'showScriptName' => true, // 隐藏 index.php
// 'suffix' => '.html', // 后缀'rules' => [// '/' => 'index/index',],],],
];
return $config;
2.controllers/IndexController.php
<?php
namespace app\controllers;
use yii\web\Controller;class IndexController extends Controller {public $layout = false;public function actionIndex() {return $this->render( '@app/views/index', ['title' => '测试',]);}
}
3.views/index.php
<html lang="zh-cn">
<head><meta charset="UTF-8"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0. maximum-scale=1.0"><title>测试</title>
</head>
<body><?php echo $title ?></body>
</html>
4./index.php
<?php
// 开发完 注释掉
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');require __DIR__ . '/vendor/autoload.php';
require __DIR__ . '/vendor/yiisoft/yii2/Yii.php';
$config = require __DIR__ . '/config/web.php';(new yii\web\Application($config))->run();
最后配置好 web
根目录,在浏览器输入 http:127.0.0.1/index.php?=index
即展示如下页面:
配置好环境就好,以后不再截图展示
三、yii2 router
路由配置、
为了说明方便,我的项目配置如下
1.在 URL
中明确指定请求的参数及要访问的控制器
http://127.0.0.1/index.php?r=index
/index.php
: 指明请求入口的php
文件
?r=index
:指明请求的是IndexController
控制器的默认方法(actionIndex
)
2.使用美化路由
开启美化 url
,隐藏了 url
中的 index.php
并添加 .html
后缀,模拟了静态网站的请求。
config/web.php
配置如下(只粘贴修改的地方)
<?php
... 省略之前/* url 管理器 */'urlManager' => ['enablePrettyUrl' => true, // 美化 url'showScriptName' => true, // 隐藏 index.php'suffix' => '.html', // 后缀'rules' => [
// '/' => 'index/index',],],
... 省略之后
- 请求的
url
http://127.0.0.1/index.html
四、常用的路由配置方式
1.url
中固定的命名参数
以下修改都是仅修改
config/web.php
中url管理器部分
- 配置文件
<?php
... 省略之前
/* url 管理器 */'urlManager' => ['enablePrettyUrl' => true, // 美化 url'showScriptName' => true, // 隐藏 index.php'suffix' => '.html', // 后缀'rules' => ['posts/' => 'index/index',],
],
... 省略之后
- 请求
url
http://127.0.0.1/posts.html
2.固定参数名 + 请求参数限制
- 配置文件
/* url 管理器 */
'urlManager' => ['enablePrettyUrl' => true, // 美化 url'showScriptName' => true, // 隐藏 index.php'suffix' => '.html', // 后缀'rules' => ['posts/<year:\d{4}>/' => 'index/index',],
],
- 请求
url
http://127.0.0.1/posts/2014.html
<year> 表示请求参数,year=2014,后边的’\d{4}'表示对year的限制为四位数字,当然也可以再添加请求参数
3.固定参数名 + 请求参数限制 + 请求参数
- 配置文件
/* url 管理器 */
'urlManager' => ['enablePrettyUrl' => true, // 美化 url'showScriptName' => true, // 隐藏 index.php'suffix' => '.html', // 后缀'rules' => ['posts/<year:\d{4}>/<category>' => 'index/index',],
],
- 请求
url
http://127.0.0.1/posts/2014/分类1.html
<year> 表示请求 year=2014,category=分类1,year中冒号之后的表示year要匹配的正则。
4.请求参数选择
- 配置文件
/* url 管理器 */
'urlManager' => ['enablePrettyUrl' => true, // 美化 url'showScriptName' => true, // 隐藏 index.php'suffix' => '.html', // 后缀'rules' => ['posts/<year:(2012|2013)>/' => 'index/index',],
],
- 请求
url
http://127.0.0.1/posts/2012.html
请求参数 year 必须为 2012 或 2013 这两个取值,如果请求其它值会导致找不到路由解析规则
5.url
配置默认参数
- 配置文件
/* url 管理器 */
'urlManager' => ['enablePrettyUrl' => true, // 美化 url'showScriptName' => true, // 隐藏 index.php'suffix' => '.html', // 后缀'rules' => [/* 其它规则 */['pattern' => 'posts/<page:\d+>/<tag>','route' => 'index/index','defaults' => ['page' => 1, 'tag' => ''],],],
],
- 请求
url
http://127.0.0.1/posts.html // 表示 page 为1,tag 为 ''
http://127.0.0.1/posts/2.html // 表示 page 为2, tag 为 ''
http://127.0.0.1/posts/2/new.html // 表示 page 为2,tag 为 new
6.url
限制请求类型
- 配置文件
/* url 管理器 */
'urlManager' => ['enablePrettyUrl' => true, // 美化 url'showScriptName' => true, // 隐藏 index.php'suffix' => '.html', // 后缀'rules' => ['GET posts/<year:(2012|2013)>/' => 'index/index','PUT,POST post/<id:\d+>' => 'post/update',],
],
- 请求
url
http://127.0.0.1/posts/2012.html
限定为 GET
请求,当然通过配置也可以限定为其它请求。
四、最后小结
1、路由配置主要是配置请求的url
与控制器名称对应表
2、yii2
路由配置允许区分请求类型
参考