yii2-路由

news/2025/2/22 12:43:36/

去年写过一篇关于 yii2-router的博文,当时完全参照 yii2官网去写,结果可想而知,没人能看懂,包括我自己。今天偶然翻起,所以决定删了旧的,再重新整理一次

一、 路由的概念

首先梳理一下GET请求与相应的简单过程(针对php后端):①客户端发出GET请求(URL);②后端服务器根据 URL, 检查指定请求是一个静态文件(请求的文件真实存在于服务端),那么直接返回该文件,如果请求的文件不存在,那么就需要用到路由,根据路由规则来确定怎么处理请求,怎么查询数据库,怎么生成页面;③将上步生成的页面返回给客户端。由此可见,路由的作用其实就是分发请求。如果没理解也没关系,继续向下看。

关于上述第②步中 “怎么处理请求”、“怎么查询数据库”、“怎么生成页面”,实际就是典型的 MVC 结构;M指数据库模型,V视图,也就是怎么生成页面,C控制器。在 MVC 中,控制器整合业务流(或者说是数据流)的处理流程,视图 和 模型 主要起辅助作用。所以也就是说,路由的作用就是为了找到 URL 请求对应的 控制器,并解析出 URL请求参数给控制器,最后控制器负责处理客户端请求。

一个网站,一般会都会留有两个后端入口,index.phpadmin.phpindex.php 供浏览者访问,另一个供站长做后台管理。有人问,必须留两个吗?答案自然是否定的,留多少都成,哪怕一个请求一个接口,但是为了网站容易管理,一般都是留两个。

二、 yii2 配置

我的 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 结果

配置好环境就好,以后不再截图展示

三、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路由配置允许区分请求类型

参考


http://www.ppmy.cn/news/205699.html

相关文章

Yii 2.0

目录 简介 概述 安装 模型 控制器 视图 小部件 实例 可访问方法 表单 简介 概述 Yii 2.0 需要 PHP 5.4.0&#xff0c;支持Composer&#xff0c;相比较Yii 1.1属于完全重写的版本。 Yii 2.0中的路径别名必须用开头&#xff0c;用于区分普通文件目录路径或URL。Yii指…

C语言++i 与i++ 详解

i;i;就C语言代码来看&#xff0c;i 和 i 都只有一行&#xff0c;看起来似乎二者的执行效率一样了&#xff1f;其实不是的&#xff0c;在学习C语言时&#xff0c;教材和老师一般都会强调 i 和 i 的区别&#xff0c;例如下面这段C语言代码&#xff1a; int i , j, k;i 0;j i;i…

如何理解int i=1;i=i++;

如何理解int i1;ii; 1、引入两个概念&#xff1a;局部变量表和操作数栈 栈帧(Stack Frame)&#xff1a; 是用于支持虚拟机进行方法调用和方法执行的数据结构&#xff0c;它是虚拟机运行时数据区的虚拟机栈(Virtual Machine Stack)的栈元素。栈帧存储了方法的局部变量表&…

tinyint(1)和int(1)的区别

问题&#xff1a;int(1) 和 tinyint(1) 有什么区别呢&#xff1f; 像这样的设计&#xff0c;反正我是不会写int(1)的。 查了下&#xff0c;mysql中设置了储存类型后&#xff0c;储存是定长的&#xff0c;也就是说&#xff0c;int(1) 和 int(4) 在硬盘中所占的字节数都是一样的…

vivox21升级鸿蒙,vivo X21i相机规格再升级,加持AI成又一拍照神器

vivo手机凭借出色的外观以及强大的拍照功能获得众多消费者的青睐&#xff0c;尤其是最新的旗舰机X21系列&#xff0c;一经上市就成为新一代异型全面屏手机的佼佼者。如今&#xff0c;再推出姐妹版X21i,延续了X21系列的设计语言&#xff0c;除了比较明显的机身后盖变化&#xff…

c语言中 x21,vivo X21i值得买吗?vivo X21i配置、外观、性能等详细评测

值得一提的是&#xff0c;在智慧桌面的最新更新中&#xff0c;vivo还加入了“美食天下”的卡片。这个卡片有不少养生、美食方面的文章&#xff0c;介绍了各种食物的独特功效。而点击菜谱分类与食材大全后&#xff0c;还有各种美食的菜谱大全。有了它&#xff0c;吃货秒变大厨&a…

Android基站定位源代码

经过几天的调研以及测试&#xff0c;终于解决了联通2G、移动2G、电信3G的基站定位代码。团队里面只有这些机器的制式了。下面就由我来做一个详细的讲解吧。1 相关技术内容 Google Android Api里面的TelephonyManager的管理。 联通、移动、电信不同制式在获取基站位置的代码区别…

使用Chat gpt提高Android开发效率

简介 在过去几周里&#xff0c;我进行了一项令人大开眼界的实验&#xff0c;将 Chat-GPT&#xff08;我使用的是 Bing Chat&#xff0c;它在后台使用了 GPT-4&#xff0c;并且可以免费使用&#xff09;融入到我的日常 Android 开发工作流程中&#xff0c;以探索它是否能够提高…