本小节介绍怎么更好地使用I-F的MVC模块,当然也只是重要的几点,随着使用的深入你将会慢慢发现更多的隐含着的技巧。
你可以实现自己的视图方案,供自己或他人使用。
想要实现自己的视图方案,只需实现接口IViewScheme即可。下面是IViewScheme和一些常用的视图方案,蓝色部分表示我们要扩充的ModelAndForm视图方案。
可以看到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强制了程序员必须输入更多有意义的信息,这种强制可以减少和客户端开发之间的口头约定