日期:2014-05-17 浏览次数:20500 次
本教程翻译自John Squibb 的Build a PHP MVC Framework in an Hour,但有所改动,原文地址:http://johnsquibb.com/tutorials
这个教程可以使大家掌握用mvc模式开发php应用的基本概念。此教程分为三个部分,现在这篇是第一部分。
现在市面上有很多流行的框架供大家使用,但是我们也可以自己动手开发一个mvc框架,采用mvc模式可以大大减少我们开发应用的时间,并且能够更好的组织项目源代码,而且其中的某些模块还可在其它项目中使用。现在我要教大家写一个简单的mvc框架。由于这个项目很简单,轻量,所以可能并不是最佳实践,也不具备安全性,还需要大家在实际应用中完善。
所用技术:php,面向对象开发方法。
开始
首先在网站根目录下建立三个文件夹
然后在根目录下新建一个文件:
现在项目结构应该像这样
§ 网站根目录
§ index.php
§ models/
§ views/
§ controllers/
index.php是整个web应用的入口点,所有的用户请求都会经过它。我们会写一些代码来把用户请求分派到相应的控制器中,这些控制器存放在controllers文件夹里。之后,我们就可以用下面的方式来实现页面跳转:
首先在index.php中定义网站根目录和网站域名,以便在整个应用中访问。
<?php //应用的根目录就是index.php的父目录 define("SERVER_ROOT", dirname(__FILE__)); //你的域名.comm 是你的服务器域名 define('SITE_ROOT' , 'http://你的域名.com');
定义了网站根目录后,在任何php文件中,都能很方便的引用其它目录的php文件,因为index.php是入口文件,这样就能够在整个应用中访问在它之中定义的这些变量。
在controllers目录下新建一个文件,名字为“router.php",这个文件用来处理所有页面请求。想像一下你家里的路由器,它负责把internet路由到家中的每个电脑。router.php文件将会获取传入到index.php的页面请求,然后把请求分派给不同的控制器(controllers)。
route.php中的代码:
<?php //获取所有请求 $request = $_SERVER['QUERY_STRING'];
//解析$request变量,得到用户请求的页面(page1)和其它GET变量(&分隔的变量)如一个请求http://你的域名.com/index.php?page1&article=buildawebsite,则被解析为array("page1", "article=buildawebsite") $parsed = explode('&' , $request); //用户请求的页面,如上面的page1,为$parsed第一个变量,shift之后,数组为array("article=buildawebsite") $page = array_shift($parsed); //剩下的为GET变量,把它们解析出来 $getVars = array(); foreach ($parsed as $argument) { //用"="分隔字符串,左边为变量,右边为值 list($variable , $value) = split('=' , $argument); $getVars[$variable] = $value; } //这是测试语句,一会儿会删除 print "The page your requested is '$page'"; print '<br/>'; $vars = print_r($getVars, TRUE); print "The following GET vars were passed to the page:<pre>".$vars."</pre>";
<?php /** * 定义文档路径 */ define("SERVER_ROOT", dirname(__FILE__)); define('SITE_ROOT' , 'http://你的域名.com'); /** * 引入router.php */ require_once(SERVER_ROOT . '/controllers/' . 'router.php'); ?>如果顺利的话,你可以打开浏览器输入:
The page you requested is 'news' The following GET vars were passed to the page: Array ( [article] => howtobuildaframework )
<?php /** * 这个文件处理文章的查询,并提供文章 */ class News_Controller { /** * $template变量会保存与此控制器相关的"view(视图)"的文件名,不包括.php后缀 */ public $template = 'news'; /** * 此方法为route.php默认调用 * * @param array $getVars 传入到index.php的GET变量数组 */ public function