【问题标题】:how to call a view method to a model in zendframework如何在 zendframework 中调用模型的视图方法
【发布时间】:2011-09-08 06:03:41
【问题描述】:

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

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

在视图上我们可以调用它

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

但是当我尝试在我的模型上调用相同的方法时

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

它会生成调用未定义方法url 的错误。 现在我想问是否可以对模型调用视图方法?如果是,那怎么办?我究竟做错了什么。 谢谢

【问题讨论】:

  • 仅供参考,您应该在控制器中使用 URL 操作助手,即 $this->_helper->url->url(array())

标签: php zend-framework


【解决方案1】:

如果你想使用 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以获得详细答案。我对助手一无所知,所以我现在应该这样做。只有一件事要澄清我无法理解您使用的术语延迟加载网址?
  • @awais-qarnilazy-load的详细解释请参考此链接。
  • @RakeshS 谢谢老兄。现在什么都有了。 :-)
【解决方案2】:

通常您不需要从模型访问视图。如果你这样做,它可能是一种气味,表明你的设计中有缺陷。视图甚至不是模型的相邻层,这使得它更臭。

一般来说,您的控制器应该将模型完成其职责所需的一切传递给模型。如果您真的需要访问视图的某些部分,因为您只是决定走捷径(有时即使在 DRY/KISS 的原则下也是必要的),那么将这些部分提供为视图助手(解耦)并在模型中使用延迟加载作为菲尔在他的回答中解释道。这是仅在需要时创建额外开销的好方法!

【讨论】:

  • +1 为您提供很好的解释。我同意你关于调用模型视图方法的观点是错误的做法。但是我遇到了一种情况,我必须从我的模型中返回 url 这就是我问的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-10
  • 2012-02-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-18
  • 2016-11-04
相关资源
最近更新 更多