你好,我只是想问一下我们是否可以调用一个模型的视图方法?我知道我们可以在zend框架中的控制器上调用它。就像我想在我的控制器上调用url方法一样,我可以像这样调用它
$this->view->url(array(),'');
在视图中我们可以通过
调用它$this->url(array(),'');
但是当我尝试通过
在我的模型上调用相同的方法时$this->view->url(array(),'');
它会生成对未定义方法url
的调用错误。
现在我想问一下是否可以将view方法调用到模型中?如果是,那怎么样?我究竟做错了什么。
感谢
答案 0 :(得分:2)
如果您想使用URL帮助器,为什么不在模型中注入/延迟加载它,例如
class Application_Model_MyModel
{
/**
* @var Zend_Controller_Action_Helper_Url
*/
private $urlHelper;
public function setUrlHelper(Zend_Controller_Action_Helper_Url $helper)
{
$this->urlHelper = $helper;
return $this;
}
/**
* Lazy load URL action helper
*
* @return Zend_Controller_Action_Helper_Url
*/
protected function getUrlHelper()
{
if (null === $this->urlHelper) {
$this->setUrlHelper(
Zend_Controller_Action_HelperBroker::getStaticHelper('url'));
}
return $this->urlHelper;
}
public function someMethod()
{
$url = $this->getUrlHelper()->url(array(), null);
}
这样,您可以将帮助器从控制器传递给您的模型......
$model = new Application_Model_MyModel;
$model->setUrlHelper($this->_helper->getHelper('url'));
或让延迟加载程序从帮助程序代理中静态获取它。
答案 1 :(得分:1)
通常您不需要从模型访问视图。如果你这样做,它可能是一种气味,表明你设计中的某些东西是有缺陷的。视图甚至不是模型的相邻层,这使得它更加嗅觉。
通常,您的控制器应将模型所需的所有内容传递给模型以满足其职责。如果你真的需要访问视图的一部分,因为你只是决定采用一个快捷方式(有时甚至需要DRY / KISS的原则)然后提供这些部分作为视图助手(解耦)并在模型中使用延迟加载菲尔在他的回答中解释道。这是仅在需要时创建额外开销的好方法!