去年写过一篇关于
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路由配置允许区分请求类型
本文详细介绍了Yii2框架中的路由概念,从请求与响应的简单过程出发,解释了路由在处理请求中的作用。接着,文章展示了如何配置路由,包括基本的路由规则设定、美化路由的实现以及各种复杂的参数限制和请求类型的约束。最后,总结了路由配置的主要内容,强调了路由配置对映射请求到控制器的重要性。
1882

被折叠的 条评论
为什么被折叠?



