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 相关文章推荐
Windows下IIS6/Apache2.2.4+MySQL5.2+PHP5.2.1安装配置方法
May 03 PHP
php 在文件指定行插入数据的代码
May 08 PHP
php生成随机密码的三种方法小结
Sep 04 PHP
PHP引用符&amp;的用法详细解析
Aug 22 PHP
WIFI万能钥匙密码查询接口实例
Sep 28 PHP
CI框架简单邮件发送类实例
May 18 PHP
PHP简单创建压缩图的方法
Aug 24 PHP
php下载文件超时时间的设置方法
Oct 06 PHP
CI(CodeIgniter)框架实现图片上传的方法
Mar 24 PHP
Laravel5.* 打印出执行的sql语句的方法
Jul 24 PHP
PHP迭代与递归实现无限级分类
Aug 28 PHP
PHP内存溢出优化代码详解
Feb 26 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
php5.2以下版本无json_decode函数的解决方法
2014/05/25 PHP
PHP中使用数组指针函数操作数组示例
2014/11/19 PHP
php实现httpRequest的方法
2015/03/13 PHP
两种php去除二维数组的重复项方法
2015/11/04 PHP
PHP redis实现超迷你全文检索
2017/03/04 PHP
php获取微信基础接口凭证Access_token
2018/08/23 PHP
取得传值的函数
2006/10/27 Javascript
解决AJAX中跨域访问出现'没有权限'的错误
2008/08/20 Javascript
判断控件是否已加载完成的代码
2010/02/24 Javascript
js页面跳转常用的几种方式
2010/11/25 Javascript
jQuery UI Datepicker length为空或不是对象错误的解决方法
2010/12/19 Javascript
javascript 树形导航菜单实例代码
2013/08/13 Javascript
JQEasy-ui在IE9以下版本中二次加载的问题分析及处理方法
2014/06/23 Javascript
node.js+Ajax实现获取HTTP服务器返回数据
2014/11/26 Javascript
jQuery DOM插入节点操作指南
2015/03/03 Javascript
Javascript 实现全屏滚动实例代码
2016/12/31 Javascript
AngularJS实现表单验证功能
2017/01/09 Javascript
JS基于面向对象实现的多个倒计时器功能示例
2017/02/28 Javascript
基于Vue实现页面切换左右滑动效果
2020/06/29 Javascript
解决vue中修改export default中脚本报一大堆错的问题
2018/08/27 Javascript
jquery的$().each和$.each的区别
2019/01/18 jQuery
微信小程序如何访问公众号文章
2019/07/08 Javascript
JS实现时间校验的代码
2020/05/25 Javascript
Python实现提取文章摘要的方法
2015/04/21 Python
python读写二进制文件的方法
2015/05/09 Python
Python松散正则表达式用法分析
2016/04/29 Python
Python实现约瑟夫环问题的方法
2016/05/03 Python
django 获取字段最大值,最新的记录操作
2020/08/09 Python
python中操作文件的模块的方法总结
2021/02/04 Python
微软香港官网及网上商店:Microsoft HK
2016/09/01 全球购物
Brasty罗马尼亚:购买手表、香水、化妆品、珠宝
2020/04/21 全球购物
食品质量与安全专业毕业生求职信
2014/08/11 职场文书
小学班主任工作经验交流材料
2015/11/02 职场文书
教你用Java在个人电脑上实现微信扫码支付
2021/06/13 Java/Android
在项目中使用redis做缓存的一些思路
2021/09/14 Redis
java如何实现socket连接方法封装
2021/09/25 Java/Android