写程序的时候,或多或少都会需要一些helper类,来减少一些重复的工作,但对helper的确立并不明确,大多数程序员喜欢称他们为common,tools,utility之类,而在mvc的领域,helper的概念则十分明确,就是来帮助开发的。
zend fx 的mvc的helper:
1.Zend_Controller_Action_Helper
在爽快地写一个个action的时候,难免需要一些重定向啊,构造url之类的需要,如果你想在当前controller里写几个私有的方法供几个action调用,是可以,但其他controller有类似需求,你难道又写一个?那好,写在基类里?多个controller都能用了,但是,这些controller应该包含这个职责吗?写在一个php文件里,include下?ok,你都做到这步了,那要框架干嘛。还是把这些琐碎的小东西交给helper来完成吧。
例如官方例子里:在某个controller里的某个action里
代码段1
$flashMessenger = $this->_helper->getHelper('FlashMessenger');
$flashMessenger->addMessage('We did something in the last request');
代码段2
$flashMessenger = $this->_helper->FlashMessenger;
$flashMessenger->addMessage('We did something in the last request');
代码段3
$this->_helper->FlashMessenger('We did something in the last request');
三段代码一样的效果,无非是___get和__call的使用,zf和ror一样,喜欢用flash来做sample
看看核心代码
public function __call($method, $args)
{
$helper = $this->getHelper($method);
if (method_exists($helper, 'direct')) {
return call_user_func_array(array($helper, 'direct'), $args);
}
throw new Zend_Controller_Action_Exception('Helper "' . $method . '" does not support overloading via direct()');
}
public function __get($name)
{
return $this->getHelper($name);
}
内置的action helper有不少,在 zend/controller/action/helper里可以找到,最有用的应该是url,viewrender和redirector
看看这些文件,仿造一个你需要的helper来,就很容易了
2.Zend_View_Helper
写网页的,前台输出的东西往往是最复杂的,指望所有东西都从controller里set过来,不是很方便,代码也很冗余,使用view helper,还是能简化不少工作,使代码更清晰
打开quickstart框架自带的/application/layouts/scripts/layout.phtml,就能看到相当多对action helper的使用:$this->doctype(),$this->headLink(),$this->layout()等等。
这些都是访问内置的zend/view/helper里的文件,从语法上看,在view里使用view helper比在action里使用action helper还要更直接,更简单些。从自己编写一个helper的代价而言,view helper也更为简单,遵循方法名首字母小写就可以实现直接调用
以Url.php的代码为例:
class Zend_View_Helper_Url extends Zend_View_Helper_Abstract
{
public function url(array $urlOptions = array(), $name = null, $reset = false, $encode = true)
{
$router = Zend_Controller_Front::getInstance()->getRouter();
return $router->assemble($urlOptions, $name, $reset, $encode);
}
}
写好view helper文件,扔到这个目录下就能用了,为了保持独立性,你也可以设置helper的目录