月度归档:2013年11月

构建一个属于你的PHP MVC 框架—-4.十字路口:控制器

对于一个框架而言,控制器决定了你的请求将要去哪里,也就是一个请求的最终处理权。所以说控制器扮演了十字路口的角色。
控制器的加载同样依赖于类库自动加载,我们把控制器放到actions目录里边去,然后在自动加载代码里边加入如下代码:


if(file_exists('actions/'.$class.'.class.php')) {
   include 'actions/' . $class  . '.class.php';
   return true;
}

最好所有的action类型都继承一个基础的action,然后在父类中定义请求处理的基本流程,
可以说是一个基础的bootstrap,比如如下的的一个基类:

class base_action {

	public function do_request(){
		$this->parse_data();
		$this->do_real_request();
		$this->before_render();
		$this->render_data();
	}

	//解析get,post,cookie等用户请求数据。
	public function parse_data(){

	}

	//真正的请求处理内容,其中,可能需要加载前边提到的model和类库等信息
	public function do_real_request(){

	}

	//消息输出前的最终处理,之类可以做一些内容过滤等
	//比如去掉所有的alert代码,所有非法的ajax请求等
	public function before_render(){

	}

	//最终输出内容
	public function render_data(){

	}
}

这样,在前边讲到的路由的那一部分获得action的name以后,实例化出一个base_action对象,
然后调用do_request方法,就可以串联起一个基本的app结构了。

构建一个属于你的PHP MVC 框架—-3.给我一个任意门吧:模型控制

模型可以说是一个框架最有灵魂的部分,他集中了跟各个地方的所有交互,包括了所有的数据的存取删除等操作。
上一篇文章我们说过类库的自动加载,实际上可以这么理解,本身模型就是一堆特殊的类库,主要是他们之中包含的操作是数据交换部分的代码。
所以,模型的控制实际上就是在类库自动加载的时候,包含一部分代码能够找到我们的模型。

我们在我们框架运行网站的根目录里建立models目录用来存放模型文件,其中建立的模型的名称规则是model_name.class.php
然后,在自动加载部分加入寻找model类文件的代码:

if(file_exists('models/'.$class.'.class.php')) {
  include 'lib/' . $class . '.php';
  return true;
}

这是给模型一个接入口。

综合各种框架,模型实际上不是单独存在的,都继承某个特殊的父类,其中封装了对外界的相关操作,
假如,你的应用有对数据库的操作,那么我们可以建立一个db_model来作为父类,有缓存的话,那么就封装cache_model,以此类推。

因为大部分的应用都是基于lamp结构的,其中必然包含了mysql。所以,作者封装了一堆mysql的操作,作为部分模型的父类,
在lib中定义db_model.class.php,填入如下代码:

class db_model {
   
}

这样你就可以在你的模型目录里,定义db_model的子类了。

class user_model extends db_model{

}

因为,在上一篇中我们已经定义了lib目录类库的自动加载,所以,这个不会因为找不到db_model而报错。
model目录里边的类文件主要用于相关的业务逻辑操作,而大部分的实际操作被封装到了父类当中,做到了代码的重用和分离。