到目前为止已经使用过很多php框架,比如:Zendframework,ThinkPHP,YII,Slim。但还未静下心来研究过框架的原理。

今天首先来看一下mvc框架中路由的原理:

所谓路由,就是程序根据浏览器上的url来进行程序分发处理(跳转)的功能代码。

我们使用框架的时候会发现一般的url请求是这样的:localhost/user/login/1 ,在这个url中我们不难发现:user为控制器的名字,而login为当前的控制器方法名,1为传入的参数(可能为用户类别)。

下面我们来实践一下路由:

建立一般mvc框架的目录结构如下:

app

--application

----controllers

----models

----views

--library     //引入库或通用方法

--public

----config

------config.php

----index.php           //入口文件

----.htaccess

路由的原理:程序用$_SERVER获取url上的请求参数,获取相应位置的参数,然后加载相应的控制器方法并执行。

一个简单的例子:

public中的index.php中加入代码:

<?php   

define(‘PROPATH’, 'D:/xampp/htdocs/app');
$root = $_SERVER['SCRIPT_NAME'];
$request = $_SERVER['REQUEST_URI']; $URI = array(); $url = trim(str_replace($root, ”, $request), ‘/’); # 如果为空,则是访问根地址
if (empty($url))
{
# 默认控制器和默认方法
$class = ‘index’;
$func = ‘index’;
}
else
{
$URI = explode(‘/’, $url); # 如果function为空 则默认访问index
if (count($URI) < 2)
{
$class = $URI[0];
$func = ‘index’;
}
else
{
$class = $URI[0];
$func = $URI[1];
}
} # 加载对应的类文件
include(PROPATH. ‘/’ . ‘application/controllers/’ . $class . ‘.php’); # 实例化
$className = ucfirst($class);
$obj = new $className (); call_user_func_array( //参见前一篇文章
# 调用内部function
array($obj,$func),
# 传递参数
array_slice($URI, 2)
);
<?php   

define(‘PROPATH’, 'D:/xampp/htdocs/app');
$root = $_SERVER['SCRIPT_NAME'];
$request = $_SERVER['REQUEST_URI']; $URI = array(); $url = trim(str_replace($root, ”, $request), ‘/’); # 如果为空,则是访问根地址
if (empty($url))
{
# 默认控制器和默认方法
$class = ‘index’;
$func = ‘index’;
}
else
{
$URI = explode(‘/’, $url); # 如果function为空 则默认访问index
if (count($URI) < 2)
{
$class = $URI[0];
$func = ‘index’;
}
else
{
$class = $URI[0];
$func = $URI[1];
}
} # 加载对应的类文件
include(PROPATH. ‘/’ . ‘application/controllers/’ . $class . ‘.php’); # 实例化
$className = ucfirst($class);
$obj = new $className (); call_user_func_array( //参见前一篇文章
# 调用内部function
array($obj,$func),
# 传递参数
array_slice($URI, 2)
);

接下来在controllers中添加一个文件:

index.php

<?php   

class Index
{ public function index()
{
echo ‘I am default controller’;
} public function hello()
{
echo ‘hello word!’;
} public function name($name)
{
echo ‘hello ‘ . $name;
}
} ?>
<?php   

class Index
{ public function index()
{
echo ‘I am default controller’;
} public function hello()
{
echo ‘hello word!’;
} public function name($name)
{
echo ‘hello ‘ . $name;
}
} ?>

ok.下面我们可以测试下。

浏览器中输入:localhost/index/index   页面输出:I am default controller

浏览器中输入:localhost/index/hello页面输出:hello word!

浏览器中输入:localhost/index/name/jack 页面输出:hello jack

这样就实现了简单的路由。

mvc框架路由原理的更多相关文章

  1. asp.net core 系列 6 MVC框架路由(下)

    一.URL 生成 接着上篇讲MVC的路由,MVC 应用程序可以使用路由的 URL 生成功能,生成指向操作的 URL 链接. 生成 URL 可消除硬编码 URL,使代码更稳定.更易维护. 此部分重点介绍 ...

  2. asp.net core 系列 5 MVC框架路由(上)

    一. 概述 介绍asp.net core路由时,我初步想了下,分几篇来说明.  路由的知识点很多,参考了官方文档提取出一些重要的知识点来说.    在ASP.NET Core中是使用路由中间件来匹配传 ...

  3. 现代主流框架路由原理 hash、history的底层原理

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Python Web Flask源码解读(二)——路由原理

    关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...

  5. MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)

    前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...

  6. MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)

    前言:最近一段时间在学习MVC源码,说实话,研读源码真是一个痛苦的过程,好多晦涩的语法搞得人晕晕乎乎.这两天算是理解了一小部分,这里先记录下来,也给需要的园友一个参考,奈何博主技术有限,如有理解不妥之 ...

  7. ASP.NET MVC 5 Web编程2 -- URL映射(路由原理)

    本章将讲述ASP.NET MVC5 的路由原理,即URL映射机制. 简单点就是解释:为什么MVC在浏览器输入地址就能访问到类(或类中的方法)?这是怎么做到的?我自己可以通过.NET写出一个自己的MVC ...

  8. 学习如何写PHP MVC框架(1) -- 路由

    说到PHP开发web,自然离不开开发框架,开发框架为我们提供了灵活的开发方式,MVC层分离,业务解耦等... 第一篇先来简单点的,说说MVC框架的路由功能... 一般的单入口框架路由都是这样的结构: ...

  9. [转]MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)

    本文转自:http://www.cnblogs.com/landeanfen/p/5989092.html 阅读目录 一.MVC原理解析 1.MVC原理 二.HttpHandler 1.HttpHan ...

随机推荐

  1. Microsoft - Union Two Sorted List with Distinct Value

    Union Two Sorted List with Distinct Value Given X = { 10, 12, 16, 20 } &  Y = {12, 18, 20, 22} W ...

  2. Hibernate有五大核心接口,分别是:Session Transaction Query SessionFactoryConfiguration

    Session接口: Session接口 Session 接口对于Hibernate 开发人员来说是一个最重要的接口.然而在Hibernate中,实例化的Session是一个轻量级的类,创建和销毁它都 ...

  3. 破解UltraEdit(Ver20.00.0.1040),无限试用

    因为是第一次破解较大型的商业软件,所以有必要记录一下,另外UE的价格也实在太贵了... 第零步:准备 准备好破解常用软件.我常用的工具有IDA(用于静态分析).Ollydbg(动态调试).PEiD(用 ...

  4. C#处理Exception的常用方法总结

     在.NET中,异常是指成员没有完成它的名称宣称可以完成的行动.在异常的机制中,异常和某件事情的发生频率无关. 异常处理四要素包括:一个表示异常详细信息的类类型:一个向调用者引发异常类实例的成员:调用 ...

  5. windows server 2008 R2 无法启用"网络发现" 需要启动的服务

    必须打开以下服务: 1.dnscache(简写.fdrespub(简写) 2.SSDP Discovery 3. UPnP Device Host 4. Computer Browser 5.Serv ...

  6. 阿里巴巴Java开发手册- 控制语句

    1. [强制]在一个 switch 块内,每个 case 要么通过 break / return 等来终止,要么注释说明程序将继续执行到哪一个 case 为止 : 在一个 switch 块内,都必须包 ...

  7. python初始环境安装

    Python下载地址 Python官网:https://www.python.org/ 在该网可以下载Python最新及历史版本.可以下载基于Windows或其它操作系统的版本. Python安装 本 ...

  8. WinRAR打包时不包含文件夹本身,只打包文件夹里的文件和目录

    加上-ep1 参数即可. rar u -m3 -s -r -o+ -ep1 -x*.zip client_zmv9.zip ".\client_zmv9\*"

  9. java 关于Java中静态代码块以及构造函数的执行先后顺序

    先转个链接  http://blog.csdn.net/wangbaokangfei/article/details/7757320 另外补充一下.静态方法,只执行一次就自动在内存中存在,再次实例化此 ...

  10. bzoj3157 3516 国王奇遇记

    Description Input 共一行包括两个正整数N和M. Output 共一行为所求表达式的值对10^9+7取模的值. 特判m=1 m≠1时: 设S[u]=sigma(i^u*m^i) m*S ...