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 于 北京