如何在zendframework中调用视图方法到模型

时间:2011-09-08 06:03:42

标签: php zend-framework

你好,我只是想问一下我们是否可以调用一个模型的视图方法?我知道我们可以在zend框架中的控制器上调用它。就像我想在我的控制器上调用url方法一样,我可以像这样调用它

$this->view->url(array(),'');

在视图中我们可以通过

调用它
$this->url(array(),'');

但是当我尝试通过

在我的模型上调用相同的方法时
$this->view->url(array(),'');

它会生成对未定义方法url的调用错误。 现在我想问一下是否可以将view方法调用到模型中?如果是,那怎么样?我究竟做错了什么。 感谢

2 个答案:

答案 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的原则)然后提供这些部分作为视图助手(解耦)并在模型中使用延迟加载菲尔在他的回答中解释道。这是仅在需要时创建额外开销的好方法!