开发自己PHP MVC框架(一)

本教程翻译自John Squibb 的Build a PHP MVC Framework in an Hour,但有所改动,原文地址:

这个教程可以使大家掌握用mvc模式开发php应用的基本概念。此教程分为三个部分,现在这篇是第一部分。

现在市面上有很多流行的框架供大家使用,但是我们也可以自己动手开发一个mvc框架,采用mvc模式可以大大减少我们开发应用的时间,并且能够更好的组织项目源代码,而且其中的某些模块还可在其它项目中使用。现在我要教大家写一个简单的mvc框架。由于这个项目很简单,轻量,所以可能并不是最佳实践,也不具备安全性,还需要大家在实际应用中完善。

所用技术:php,面向对象开发方法。

开始

首先在网站根目录下建立三个文件夹

然后在根目录下新建一个文件:

index.php

现在项目结构应该像这样

§网站根目录

§index.php

§models/

§views/

§controllers/

index.php是整个web应用的入口点,所有的用户请求都会经过它。我们会写一些代码来把用户请求分派到相应的控制器中,这些控制器存放在controllers文件夹里。之后,我们就可以用下面的方式来实现页面跳转:

设置前端控制器index.php

首先在index.php中定义网站根目录和网站域名,以便在整个应用中访问。

<?php//应用的根目录就是index.php的父目录define("SERVER_ROOT", dirname(__FILE__));//你的域名.comm 是你的服务器域名define(‘SITE_ROOT’ , ‘http://你的域名.com’);

定义了网站根目录后,在任何php文件中,都能很方便的引用其它目录的php文件,因为index.php是入口文件,这样就能够在整个应用中访问在它之中定义的这些变量。

设置路由器router.php(转发用户请求到相应控制器)

在controllers目录下新建一个文件,名字为“router.php",这个文件用来处理所有页面请求。想像一下你家里的路由器,它负责把internet路由到家中的每个电脑。router.php文件将会获取传入到index.php的页面请求,然后把请求分派给不同的控制器(controllers)。

route.php中的代码:

<?php//获取所有请求$request = $_SERVER[‘QUERY_STRING’];这句代码会获取传入到应用中的请求参数。QUERY_STRING就是”?“后面的所有字符串。你的域名.com/index.php?page1

上面的地址会在代码中得到”page1&action=login“,为了把page1和后面的参数分开,我们需要在route.php中继续加入下列代码:

//解析$request变量,得到用户请求的页面(page1)和其它GET变量(&分隔的变量)如一个请求你的域名.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>";

现在我们需要在index.php中引入route.php

<?php/** * 定义文档路径 */define("SERVER_ROOT", dirname(__FILE__));define(‘SITE_ROOT’ , ‘http://你的域名.com’);/** * 引入router.php */ require_once(SERVER_ROOT . ‘/controllers/’ . ‘router.php’);?>如果顺利的话,你可以打开浏览器输入:

你的域名.com/index.php?news&article=howtobuildaframework

我们会看到如下输出

The page you requested is ‘news’The following GET vars were passed to the page:Array([article] => howtobuildaframework)如果没有上述输出,请检查你的服务器配置是否正确,并检查代码是否有错误。

现在来让我们添加一个页面到我们的网站里,这样就可以让router.php来产生一个页面,而不是直接输出上面的信息。

创建一个控制器(controller)

在controllers文件夹里新建一个文件名为“news.php",定义如下的类:

<?php/** * 这个文件处理文章的查询,并提供文章 */class News_Controller{/*** $template变量会保存与此控制器相关的"view(视图)"的文件名,不包括.php后缀*/public $template = ‘news’;/*** 此方法为route.php默认调用** @param array $getVars 传入到index.php的GET变量数组*/public function main(array $getVars){//测试代码,以后会删除print "We are in news!";print ‘<br/>’;$vars = print_r($getVars, TRUE);print("The following GET vars were passed to this controller:" ."<pre>".$vars."</pre>");}}注意我们把route.php中的测试代码复制过来了,并做了一些修改,我们把它放置在main函数里。现在让我们来修改route.php中的代码:

<?php/** * 此文件会把所有的传入参数分派到相应的控制器中 *///获取请求参数$request = $_SERVER[‘QUERY_STRING’];//解析请求页面和其它GET变量$parsed = explode(‘&’ , $request);//页面是第一个元素$page = array_shift($parsed);//剩余的为GET变量,也把它们解析出来$getVars = array();foreach ($parsed as $argument){//split GET vars along ‘=’ symbol to separate variable, valueslist($variable , $value) = split(‘=’ , $argument);$getVars[$variable] = $value;}//构成控制器文件路径$target = SERVER_ROOT . ‘/controllers/’ . $page . ‘.php’;//引入目标文件if (file_exists($target)){include_once($target);//修改page变量,以符合命名规范(如$page="news",我们的约定是首字母大写,控制器的话就在后面加上“_Controller”,即News_Controller)$class = ucfirst($page) . ‘_Controller’;//初始化对应的类if (class_exists($class)){$controller = new $class;}else{//类的命名正确吗?die(‘class does not exist!’);}}else{//不能在controllers找到此文件die(‘page does not exist!’);}//一但初始化了控制器,就调用它的默认函数main();//把get变量传给它$controller->main($getVars);?>

人生至少要有两次冲动,一为奋不顾身的爱情,一为说走就走的旅行。

开发自己PHP MVC框架(一)

相关文章:

你感兴趣的文章:

标签云: