PHP路由技术的原理与实践
0x00 路由实现原理
用户通过指定的URL范式对后台进行訪问。URL路由处理类进行处理后。转发到逻辑处理类,逻辑处理类将请求结果返回给用户。
约定URL范式和规则
约定一套自己喜欢的,对搜索引擎友好。对用户友好的URL规则
URL处理类(即路由实现的核心)
对用户请求的URL进行解析处理,获取到用户请求的类,方法,以及Query參数等,并将请求转发给逻辑处理类。
逻辑处理类
处理站点的真实业务逻辑。
0x01 URL范式约定
眼下来说,有两种比較流行的URL格式,一种是普通模式,一种是 pathinfo 模式。
普通模式
在 ThinkPHP 框架中,默认的URL格式即为普通模式。普通模式URL例如以下:
index.php?
m=home&c=user&a=login&v=value
当中 m 參数的值为模块名称。 c 參数的值为控制器名称, a 參数的值为方法名称,之后的參数则为该方法中所要接收的其它 GET 请求參数
pathinfo模式
在 CodeIgniter 框架中,默认的URL格式为 pathinfo 模式,例如以下:
index.php/controller/method/prarme1/value1
这块的意义也已经标注的非常明确了,在 method 以后,就是方法接收的 GET 參数了,格式就是 名称/值
0x02 URL路由处理类(核心)
此处我们选用最简单的普通单模块模式进行演示。仅仅为说明简单的原理,例如以下:
index.php?
c=user&a=login&v=value
我们约定參数 c 为控制器名称,參数 a 为方法名称,之后的均是 GET 參数
<?php
include 'index.class.php';
include 'user.class.php';
// 对用户请求URL进行处理
$query = $_GET;
$controller = isset($query['c']) ? $query['c'] : 'indexController';
$action = isset($query['a']) ? $query['a'] : 'index';
if (class_exists($controller)) {
if (method_exists($controller, $action)) {
unset($_GET['c']);
unset($_GET['a']);
// 实例化用户请求类并调用方法
(new $controller())->$action();
} else {
echo '控制器' . $controller . '中不存在方法' . $action;
}
} else {
echo '不存在控制器' . $controller;
}
当中 unset() 掉两个get參数,仅仅是为了对真正调用的方法造成其它影响。
0x03 逻辑处理类
逻辑处理类就是终于的业务逻辑,也就是真正的回应用户请求的代码片段。以下仅仅是一个简单的演示样例:
/* index.class.php 文件源代码 */
<?
php
class indexController {
public function index(){
var_dump($_GET);
}
}
/* user.class.php 文件源代码 */
<?php
class user {
public function index() {
echo '这里是User控制器';
}
public function login() {
var_dump($_GET);
}
}
0x04 结束
这里仅仅是最简单的PHP路由技术的原理。事实上真正为一个项目或者框架进行路由开发,可能须要可以兼容非常多复杂的情况。须要对各种情况都要考虑到。
原文作者:我才是二亮
原文链接:http://www.2liang.me/?p=230
转载必须在正文中标注并保留原文链接、作者等信息。
PHP路由技术的原理与实践的更多相关文章
- 搞懂分布式技术10:LVS实现负载均衡的原理与实践
搞懂分布式技术10:LVS实现负载均衡的原理与实践 浅析负载均衡及LVS实现 原创: fireflyc 写程序的康德 2017-09-19 负载均衡 负载均衡(Load Balance,缩写LB)是一 ...
- Java 动态调试技术原理及实践
本文转载自Java 动态调试技术原理及实践 导语 断点调试是我们最常使用的调试手段,它可以获取到方法执行过程中的变量信息,并可以观察到方法的执行路径.但断点调试会在断点位置停顿,使得整个应用停止响应. ...
- Atitit.ide技术原理与实践attilax总结
Atitit.ide技术原理与实践attilax总结 1.1. 语法着色1 1.2. 智能提示1 1.3. 类成员outline..func list1 1.4. 类型推导(type inferenc ...
- Atitit.异步编程技术原理与实践attilax总结
Atitit.异步编程技术原理与实践attilax总结 1. 俩种实现模式 类库方式,以及语言方式,java futuretask ,c# await1 2. 事件(中断)机制1 3. Await 模 ...
- Atitit.gui api自动化调用技术原理与实践
Atitit.gui api自动化调用技术原理与实践 gui接口实现分类(h5,win gui, paint opengl,,swing,,.net winform,)1 Solu cate1 Sol ...
- 20165223《网络对抗技术》Exp3 免杀原理与实践
目录 -- 免杀原理与实践 免杀原理与实践 本次实验任务 基础知识问答 免杀扫描引擎 实验内容 正确使用msf编码器,msfvenom生成jar等文件,veil-evasion,加壳工具,使用shel ...
- 20165223《网络对抗技术》Exp2 后门原理与实践
目录 -- 后门原理与实践 后门原理与实践说明 实验任务 基础知识问答 常用后门工具 实验内容 任务一:使用netcat获取主机操作Shell,cron启动 任务二:使用socat获取主机操作Shel ...
- 2018-2019-2 网络对抗技术 20165232 Exp3 免杀原理与实践
2018-2019-2 网络对抗技术 20165232 Exp3 免杀原理与实践 免杀原理及基础问题回答 一.免杀原理 一般是对恶意软件做处理,让它不被杀毒软件所检测.也是渗透测试中需要使用到的技术. ...
- 2018-2019-2 网络对抗技术 20165232 Exp2 后门原理与实践
2018-2019-2 网络对抗技术 20165232 Exp2 后门原理与实践 1. 后门原理与实践实验说明及预备知识 一.实验说明 任务一:使用netcat获取主机操作Shell,cron启动 ( ...
随机推荐
- BZOJ2690: 字符串游戏(平衡树动态维护Dfs序)
Description 给定N个仅有a~z组成的字符串ai,每个字符串都有一个权值vi,有M次操作,操作分三种: Cv x v':把第x个字符串的权值修改为v' Cs x a':把第x个字符串修改成a ...
- mysql中group by和order by混用 结果不是理想结果
在使用mysql排序的时候会想到按照降序分组来获得一组数据,而使用order by往往得到的不是理想中的结果,那么怎么才能使用group by 和order by得到理想中的数据结果呢? 例如 有一个 ...
- 2018上半年GitHub上最热门的开源项目
关注GitHub的人都知道,这个平台上面有太多优秀的值得学习的开源项目了,这里总结了2018上半年GitHub上最热门的开源项目. 1: tensorflow https://github.com/t ...
- Activiti工作流框架学习(二)——使用Activiti提供的API完成流程操作
可以在项目中加入log4j,将logj4.properties文件拷入到src目录下,这样框架执行的sql就可以输出到到控制台,log4j提供的日志级别有以下几种: Fatal error war ...
- 关于HashMap
总是觉得对HashMap很熟悉,但最近连续被问到几个关于它的问题,才发现它其实并不简单.这里对关于它的一些问题做个总结,也希望能够大家一个参考. 都知道它是基于hash值,可以进行常量时间消化的存储结 ...
- Ajax的跨域问题分析
一.Ajax的跨域问题 Ajax是利用javascript内置XMLHttpRequest对象来进行传输的,所以它依赖于XMLHttpRequest对象,而XMLHttpRequest对象却有很多的限 ...
- BZOJ5027: 数学题
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 140 Solved: 48[Submit][Status][Discuss] Description ...
- 计算加班类型以及小时数(js)
function GetDateDiff(startTime, endTime, diffType) { //将xxxx-xx-xx的时间格式,转换为 xxxx/xx/xx的格式 startTime ...
- 使用Java语言开发微信公众平台(五)——被关注回复与关键词回复
在上一篇文章中,我们实现了文本消息的接收与响应.可以在用户发送任何内容的时候,回复一段固定的文字.本章节中,我们将对上一章节的代码进行适当的完善,同时实现[被关注回复与关键词回复]功能. 一.微信 ...
- pidof---查找指定名称的进程的进程号id号。
pidof命令用于查找指定名称的进程的进程号id号. 语法 pidof(选项)(参数) 选项 -s:仅返回一个进程号: -c:仅显示具有相同“root”目录的进程: -x:显示由脚本开启的进程: -o ...