Posts Tagged ‘view’

MVC中view的基本实现

Posted by 机器人 on 14th 一月 2009 in php/javascript

以前没有自己写过MVC方面的框架,最近系统准备重构,一直在犹豫是直接用过程写呢,还是采用MVC模板,逻辑和实现分离。其实我们的系统很简单,功能也不多,但作为垂直搜索引擎的用户界面部分,对处理速率要求应该算是比较高的。如果直接采用过程散写的话,效果就和目前的架构没什么两样,可能会在代码组织上好一些,系统结构不是特别清晰。如果采用现在的任意一款流行框架来写,当然这是完全不允许的。为了解决这个矛盾,所以决定自己实现一个非常MIN型的针对本系统定制的一个架构出来。

假想框架使用代码如下:
代码 一:

class Tester extends Base {
	public function test() {
		$data = array(
		'test1',
		'test2',
		'test3',
		);
		$this->oView->assign('data',$data);
		//or
		$this->oView->data = $data;
		echo $this->oView->render('test');
	}
}

上面的oView对象就是下面需要介绍的VIEW类的一个实例。它负责所有模板的调用和显示工作。
模板实现如下:
代码二

< ?php foreach ($this->data as $val):?>
<li>< ?php echo $val;?></li>
< ?php endforeach;?>

在模板里,$this就代表oView对象。
VIEW假想实现代码如下
代码 三:

class View {
	private $_path = null;
	private $_file = null;
	public function __construct() {
 
	}
	public function __get($key) {
		return null;
	}
	public function __set($key,$val) {
		$this->$key = $val;
		return;
	}
	public function setScriptPath($path) {
		$this->_path = $path;
		return $this;
	}
	public function assign($spec, $value = null) {
		if (is_string($spec)) $this->$spec = $value;
		else if (is_array($spec)) {
			foreach ($spec as $key => $val) {
				$this->$key = $val;
			}
		}
		return $this;
	}
	private function _script($name) {
		return $this->_path.'/'.$name.'.html';
	}
	public function render($name) {
		$this->_file = $this->_script($name);
		ob_start();
		require_once($this->_file);
		$content = ob_get_contents();
		ob_end_clean();
		return $content;
	}
}

对于代码一中的

$this->oView->data = $data

的实现核心就在__set()这个PHP5所提供的魔法函数上。当我们在对一个不存在的变量进行赋值操作时,该函数就会被调用,这时,就可以在该函数里进行动态创建对象的属性。
关于对模板内容的统一输出

echo $this->oView->render('test');

关键就在于

ob_start();
require_once($this->_file);
$content = ob_get_contents();
ob_end_clean();
return $content;

这段代码,其实实现的技巧就是在包含模板文件里,先打开缓冲区,让所包含的内容输出到缓冲区中。然后将所有的缓冲区数据交给一个变量来保存,这样就很方便的实现了模板内容可能按照我们的愿望来进行输出。

上面的代码只是我的一个假象片断,具体的一些异常处理在上面没有涉及到。

机器人 2009-01-14 21:39 于 北京