4.6. 深入一点

4.6.1. 写自己的视图方案

本小节介绍怎么更好地使用I-F的MVC模块,当然也只是重要的几点,随着使用的深入你将会慢慢发现更多的隐含着的技巧。

4.6.1. 写自己的视图方案

你可以实现自己的视图方案,供自己或他人使用。

想要实现自己的视图方案,只需实现接口IViewScheme即可。下面是IViewScheme和一些常用的视图方案,蓝色部分表示我们要扩充的ModelAndForm视图方案。

图 4.2. IViewScheme

IViewScheme

可以看到IViewScheme接口只定义了一个invoke()方法和一个put($key, $value)方法。

我们要实现的ModelAndForm功能是根据数据自动生成一个表单,并且可以提交。接着控制器“分发器”的例子,我们在controller里加入ModelAndForm.php(虽然它的位置不太合理)和FormTestController.php,前者用来定义视图方案,后者用来测试。现在我们的目录结构为:

/controller
    HelloWorldController.php
    ...
    ModelAndForm.php
    FormTestController.php
index.php

然后ModelAndForm.php的内容为:

<?php

class ModelAndForm implements IViewScheme {
    private 
$model;
    
    public function 
__construct($model) {
        
$this->model $model;
    }
    
    public function 
invoke() {
        
$form "<form method='post'>\nplease enter the infomation:<br/>\n";
        foreach (
$this->model as $name=>$value) {
            
$form .= "{$name}: <input type='text' name='{$name}' value='{$value}'/><br/>\n";
        }
        
$form .= "<input type='submit' value='submit'/>\n";
        
$form .= "</form>";
        echo 
$form;
    }
    
       public function 
put($key$value) {
           
$this->model[$key] = $value;
       }
}


?>

ModelAndForm类实现了(通过implements关键字)IViewScheme定义的invoke方法,它也提供了一个构造器__construct用来接受数据模型,然后在invoke方法中将其转换为一个表单,并输出,看起来十分简单。现在就可以在控制器中使用它,FormTestController.php

<?php

class FormTestController extends IApplication {
    public function 
appIndex() {
        
//定义表单元素
        
$elements = array("name"=>"iwind""age"=>20);
        
        
//返回一个视图方案对象
        
return new ModelAndForm($elements);
    }
}

?>

访问

http://framework/iframework2/index.php?controller=formTest

这时候分发器将先实例化FormTestController得到对象,并调用对象中的appIndex方法,然后再执行ModelAndForm对象的invoke方法,输出

<form method='post'>
please enter the infomation:<br/>
name: <input type='text' name='name' value='iwind'/><br/>
age: <input type='text' name='age' value='20'/><br/>
<input type='submit' value='submit'/>
</form>

在以下几种情况下你可以考虑写自己的视图方案

  • 你需要将模型输出为特殊格式,比如本例是将数据组织为一个可以提交的表单

  • 集成其他的模板引擎,比如IModelAndSmarty就集成了Smarty模板引擎,它的好处调用视图方案的程序员无需知道Smarty到底是怎么工作的,也无需再写一大堆的assign调用

  • 你想添加更多有意义的信息,比如IJSONResponse就比IJSON强制了程序员必须输入更多有意义的信息,这种强制可以减少和客户端开发之间的口头约定