到目前为止已经使用过很多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. 剑指offer-特定二维数组中查找一个元素是否存在-二分搜索-二维数组

    int [][] array ={ {1,2,8,9}, {2,4,9,12}, {4,7,10,13}, {6,8,11,19} }; 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都 ...

  2. android BSP移植综述

    将android移植到特定硬件平台上,其核心是bsp的搭建工作,bsp是板级支持包,并不是特定某个文件,而是从功能上理解的一种硬件适配软件包,它的核心就是: 1. linux内核硬件相关部分(主要是l ...

  3. SVN服务器搭建和使用(四)

    在第一次使用TortoiseSVN从服务器CheckOut的时候,会要求输入用户名和密码,这时输入框下面有个选项是保存认证信息,如果选了这个选项,那么以后就不用每次都输入一遍用户名密码了. 不过,如果 ...

  4. HTML图片热区map area的用法

    <area>标记主要用于图像地图,通过该标记可以在图像地图中设定作用区域(又称为热点),这样当用户的鼠标移到指定的作用区域点击时,会自动链接到预先设定好的页面.其基本语法结构如下: < ...

  5. 使用python把html网页转成pdf文件

    我们看到一些比较写的比较好文章或者博客的时候,想保存下来到本地当一个pdf文件,当做自己的知识储备,以后即使这个博客或者文章的连接不存在了,或者被删掉,咱们自己也还有. 当然咱们作为一个coder,这 ...

  6. Javascript undefined 和 null

    Javascript undefined 和 null 虽然 Javascript 一切皆对象,但是类型还是有区别的. undefined 表示 未定义的数据类型. null 表示空对象. 在判断时没 ...

  7. MySQL架构设计谈:从开发规范、选型、拆分到减压(转)

    作者介绍 李辉,原新浪爱彩票运维负责人,常用网名:门牙没了.曾主导新浪爱彩票的MySQL运维工作.培训合伙人.资深讲师,中国科学院大学在读研究生(大数据方向),擅长大型项目的关系型数据库运维和管理,现 ...

  8. PHP $_SERVER 祥细解读(有事例)

    为了看的更明白,添加上了事例 例如  'www.ceshiyuming.com/ceshi.php?p=123';Array(    [HOSTNAME] =>     [PATH] => ...

  9. Yii 用户登录验证

    http://blog.sina.com.cn/s/blog_685213e70101mo4i.html 1)首先在model文件夹中新建文件 LoginForm.php 代码如下 <?php ...

  10. 【刷题】Search in a Big Sorted Array

    原题戳我. 题目 Description Given a big sorted array with positive integers sorted by ascending order. The ...