mvc框架路由原理
到目前为止已经使用过很多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框架路由原理的更多相关文章
- asp.net core 系列 6 MVC框架路由(下)
一.URL 生成 接着上篇讲MVC的路由,MVC 应用程序可以使用路由的 URL 生成功能,生成指向操作的 URL 链接. 生成 URL 可消除硬编码 URL,使代码更稳定.更易维护. 此部分重点介绍 ...
- asp.net core 系列 5 MVC框架路由(上)
一. 概述 介绍asp.net core路由时,我初步想了下,分几篇来说明. 路由的知识点很多,参考了官方文档提取出一些重要的知识点来说. 在ASP.NET Core中是使用路由中间件来匹配传 ...
- 现代主流框架路由原理 hash、history的底层原理
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Python Web Flask源码解读(二)——路由原理
关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...
- MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)
前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...
- MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)
前言:最近一段时间在学习MVC源码,说实话,研读源码真是一个痛苦的过程,好多晦涩的语法搞得人晕晕乎乎.这两天算是理解了一小部分,这里先记录下来,也给需要的园友一个参考,奈何博主技术有限,如有理解不妥之 ...
- ASP.NET MVC 5 Web编程2 -- URL映射(路由原理)
本章将讲述ASP.NET MVC5 的路由原理,即URL映射机制. 简单点就是解释:为什么MVC在浏览器输入地址就能访问到类(或类中的方法)?这是怎么做到的?我自己可以通过.NET写出一个自己的MVC ...
- 学习如何写PHP MVC框架(1) -- 路由
说到PHP开发web,自然离不开开发框架,开发框架为我们提供了灵活的开发方式,MVC层分离,业务解耦等... 第一篇先来简单点的,说说MVC框架的路由功能... 一般的单入口框架路由都是这样的结构: ...
- [转]MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)
本文转自:http://www.cnblogs.com/landeanfen/p/5989092.html 阅读目录 一.MVC原理解析 1.MVC原理 二.HttpHandler 1.HttpHan ...
随机推荐
- 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第4章 4.2 activation-group& dialect& date-effective
转载至:https://blog.csdn.net/wo541075754/article/details/75511887 activation-group 该属性将若干个规则划分成一个组,统一命名 ...
- /proc/sys/vm/drop_caches 清理缓存
1. 使用方法 /proc/sys/vm/drop_caches默认是0 # echo 1 > /proc/sys/vm/drop_caches; free pagecache, use# ec ...
- MySQL删除超大表操作
======================================================================== 问题原因 通常情况下,会使用innodb_file_p ...
- .NET基金会成立
作者 Jonathan Allen ,译者 臧秀涛 发布于 2014年4月8日 随着.NET基金会的成立,微软在成为主要的开源参与者的道路上又前进了一步.该基金会的宗旨是“成为越来越多的开源.NET项 ...
- vertx.io 与nodejs 一个简单的性能比较
vertx.io 与node 都是可以进行js运行的一个引擎,但是vertx 支持的语言相对于node 多,可以查看官网.今天下网上查询相关的信息 时来了解到vertx.io 性能比node 好,于是 ...
- 使用 Python 连接到 PADS Layout
使用 Python 连接到 PADS Layout PADS Layout 使用的是 VBA 编程,很多人说 VBA 很简单,但是实在学不会,可能是太笨了. 后来发现 PADS Layout 有 CO ...
- CentOS6.8 x64+Nginx1.3.8/Apache-httpd 2.4.3+PHP5.4.8(php-fpm)+MySQL5.5.28+CoreSeek4.1源码编译安装
系统为CentOS6.8 x64服务器版精简安装. 准备工作 部署安装目录 /usr/local/* /var/lib/* /var/lib64/* 下载源文件 #cd /usr/local/src ...
- Django Admin 时间格式化
http://961911.blog.51cto.com/951911/1557218 修改settings.py,添加一下内容: USE_L10N = False DATETIME_FORMAT = ...
- zedgraph控件的一些比较有用的属性 转
(1)zedgraph控件属性具体解释: AxisChange()() ->> This performs an axis change command on the graphPane. ...
- hello word 应用程序的编写
1.各类文件的书写 src中的文件: hello文件夹中的Makefile文件 # # Copyright (C) - OpenWrt.org # # This is free software, l ...