PHP MVC框架路由学习笔记


Posted in PHP onMarch 02, 2016

提到PHP开发web,自然离不开开发框架,开发框架为我们提供了灵活的开发方式,MVC层分离,业务解耦等。。。

第一篇先来简单点的,说说MVC框架的路由功能。。。

一般的单入口框架路由都是这样的结构:

domain/index.php/classname/functionname/var1/var2

这里的index.php 就被称为入口文件。。。对于服务器而言,你这里访问的就只有index.php 后面调用的controller 和里面的方法,甚至传值都是在框架内部基于PHP层面实现的。

Talk is cheap, show you the code !!

首先,先建立好下面的文件结构

我们来动手试试,怎么才能访问到controllers里面的文件。。。

在index.php里面输入以下内容

print_r($_SERVER);

然后访问 以下地址试试。

yourdomain/index.php/class/function/var1

这里作者我是用本地环境的,我访问的地址是localhost/MVC/index.php/class/function/var1

我贴出最重要的2个变量

[REQUEST_URI] => /MVC/index.php/class/function/var1
[SCRIPT_NAME] => /MVC/index.php

其实路由最基本的原理就在这里:

通过这2个变量来提取url地址里的class 和 function,参数等,然后把class include进来,通过PHP的回调函数call_user_func_array 调用对应的function和传递相应的参数。

接下来上代码,读代码应该比我写的易懂。哈哈~~

index.php 的内容如下

<?php 
# 定义application路径 
define(‘APPPATH', trim(__DIR__,'/')); 
# 获得请求地址 
$root = $_SERVER['SCRIPT_NAME']; 
$request = $_SERVER['REQUEST_URI']; 
$URI = array(); 
# 获得index.php 后面的地址 
$url = trim(str_replace($root, ”, $request), ‘/'); 
# 如果为空,则是访问根地址 
if (empty($url)) 
{ 
# 默认控制器和默认方法 
$class = ‘index'; 
$func = ‘welcome'; 
} 
else 
{ 
$URI = explode(‘/', $url); 
# 如果function为空 则默认访问index 
if (count($URI) < 2) 
{ 
$class = $URI[0]; 
$func = ‘index'; 
} 
else 
{ 
$class = $URI[0]; 
$func = $URI[1]; 
} 
} 
# 把class加载进来 
include(APPPATH . ‘/' . ‘application/controllers/' . $class . ‘.php'); 
#实例化 
$obj = new ucfirst($class); 
call_user_func_array( 
# 调用内部function 
array($obj,$func), 
# 传递参数 
array_slice($URI, 2) 
);

在application/controllers 里面添加下面2个文件

index.php 用于作为默认控制器

<?php 
class Index 
{ 
function welcome() 
{ 
echo ‘I am default controller'; 
} 
} 
?> 
hello.php
<?php 
class Hello 
{ 
public function index() 
{ 
echo ‘hello world'; 
} 
public function name($name) 
{ 
echo ‘hello ‘ . $name; 
} 
} 
?>

测试一下看看,能不能访问了。根据上面的路由结构。我们来试试

这个访问正常,正确调用了hello这个class内部的name方法,然后把参数barbery传递过去了。。。

再试试不输入function name,看看能不能默认调用index。。

答案也是可以的。。。

最后一个,访问root地址看看

也正确的映射到了默认控制器上。。。

ok,一个简单的MVC路由功能就完成了。。。

PHP 相关文章推荐
一次编写,随处运行
Oct 09 PHP
php获取地址栏信息的代码
Oct 08 PHP
Php 构造函数construct的前下划线是双的_
Dec 08 PHP
如何使用PHP获取指定日期所在月的开始日期与结束日期
Aug 01 PHP
php+mysql不用递归实现的无限级分类实例(非递归)
Jul 08 PHP
实例讲解PHP面向对象之多态
Aug 20 PHP
教你在PHPStorm中配置Xdebug
Jul 27 PHP
php 如何禁用eval() 函数实例详解
Dec 01 PHP
PHP中静态变量的使用方法实例分析
Dec 01 PHP
PHP封装的PDO数据库操作类实例
Jun 21 PHP
php 调用百度sms来发送短信的实现示例
Nov 02 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
Feb 28 PHP
深入浅析用PHP实现MVC
Mar 02 #PHP
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
Mar 01 #PHP
编写PHP脚本清除WordPress头部冗余代码的方法讲解
Mar 01 #PHP
WordPress的文章自动添加关键词及关键词的SEO优化
Mar 01 #PHP
详解WordPress中的头像缓存和代理中的缓存更新方法
Mar 01 #PHP
php编程每天必学之表单验证
Mar 01 #PHP
实例讲解PHP设计模式编程中的简单工厂模式
Feb 29 #PHP
You might like
phpmyadmin的#1251问题
2006/11/25 PHP
windows下PHP APACHE MYSQ完整配置
2007/01/02 PHP
zf框架db类的分页示例分享
2014/03/14 PHP
php创建无限级树型菜单
2015/11/05 PHP
PHP读取大文件的几种方法介绍
2016/10/27 PHP
基于PHP的加载类操作以及其他两种魔术方法的应用实例
2017/08/28 PHP
阿里云的WindowsServer2016上部署php+apache
2018/07/17 PHP
JavaScript单元测试ABC
2012/04/12 Javascript
js 距离某一时间点时间是多少实现代码
2013/10/14 Javascript
js处理php输出时间戳对不上号的解决方法
2014/06/20 Javascript
node.js中的path.delimiter方法使用说明
2014/12/09 Javascript
jQuery学习笔记之创建DOM元素
2015/01/19 Javascript
NodeJS中利用Promise来封装异步函数
2015/02/25 NodeJs
使用CoffeeScrip优美方式编写javascript代码
2015/10/28 Javascript
jQuery获取同级元素的简单代码
2016/07/09 Javascript
详解node HTTP请求客户端 - Request
2017/05/05 Javascript
JavaScrpt的面向对象全面解析
2017/05/09 Javascript
bootstrap模态框关闭后清除模态框的数据方法
2018/08/10 Javascript
详解Angular中实现自定义组件的双向绑定的两种方法
2018/11/23 Javascript
基于jQuery拖拽事件的封装
2020/11/29 jQuery
python清理子进程机制剖析
2017/11/23 Python
Python3.6实现连接mysql或mariadb的方法分析
2018/05/18 Python
win7下python3.6安装配置方法图文教程
2018/07/31 Python
python+pyqt5实现KFC点餐收银系统
2019/01/24 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
2019/06/18 Python
关于Python核心框架tornado的异步协程的2种方法详解
2019/08/28 Python
基于Tensorflow高阶读写教程
2020/02/10 Python
利用scikitlearn画ROC曲线实例
2020/07/02 Python
详解使用Python写一个向数据库填充数据的小工具(推荐)
2020/09/11 Python
酒店服务与管理毕业生求职信
2013/11/02 职场文书
家居装修公司创业计划书范文
2014/03/20 职场文书
捐款倡议书怎么写
2014/05/13 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话全文
2014/10/25 职场文书
小学美术教学反思
2016/02/17 职场文书
Mysql数据库表中为什么有索引却没有提高查询速度
2022/02/24 MySQL
Python可变与不可变数据和深拷贝与浅拷贝
2022/04/06 Python