4

下面的方法如何工作?

$this->getRequest()->getPost();

getPost()类中没有方法Zend_Controller_Request_Abstract,但它如何工作?在 OOP 原则中,方法getPost()应该出现在Zend_Controller_Request_Abstract.

如果没有直接实例,Zend 怎么能引入getPost()类呢?Zend_Controller_Request_Http

谢谢你。

4

3 回答 3

2

getPost()Zend_Controller_Request_Http扩展Zend_Controller_Request_Abstract.

于 2012-04-05T13:35:16.207 回答
2

Zend 将首先将您的所有请求发送到 Zend/Controller/Front.php 中的 FrontController。FrontController 会将 Http 请求注入控制器这里是它发生的代码

    /**
     * Instantiate default request object (HTTP version) if none provided
     */
    if (null !== $request) {
        $this->setRequest($request);
    } elseif ((null === $request) && (null === ($request = $this->getRequest()))) {
        require_once 'Zend/Controller/Request/Http.php';
        $request = new Zend_Controller_Request_Http();
        $this->setRequest($request);
    }

frontcontroller 的目的是初始化请求环境,路由传入的请求,然后调度任何发现的动作;它聚合所有响应并在过程完成时返回它们。

更多关于 FrontController 的信息在这里

进一步回答您的问题

/**
 * Return the Request object
 *
 * @return Zend_Controller_Request_Abstract
 */
public function getRequest()
{
    return $this->_request;
}

这就是您在 Zend/Controller/Action.php 中的内容 - 这里的注释说 Zend_Controller_Request_Abstract ' is-a ' 返回类型。我突出显示'is-a',因为它可以返回任何'is-a' Zend_Controller_Request_Abstract 类。有关 is-a 的更多信息,请查看此维基百科页面

“在知识表示、面向对象的编程和设计中,is-a 或 is_a 或 is a(包含)是一种关系,其中一个类 D 是另一个类 B 的子类(因此 B 是 D 的超类)。”

于 2012-04-05T13:44:30.387 回答
1

虽然我投票结束了这个问题(“这个问题可能会征求意见、辩论、争论、投票或扩展讨论”),但我认为你提出了一个有趣的观点。我认为 ZF 开发团队可以辩护如下:

就框架而言,Action 只需要实现Zend_Controller_Action_Interface,本质上就是dispatch()方法。该框架提供了一个抽象实现类Zend_Controller_Action,我们作为用户级应用程序开发人员通常扩展它来定义我们的操作方法等。但是该类中没有任何实际需要Zend_Controller_Request_Http. $request->getPost()框架代码中没有固有的依赖关系。只有在用户空间中,我们的应用程序开发人员通常会使用创建实例的默认调度流程,这反过来又使我们能够通过该方法Zend_Controller_Request_Http访问 POST 。getPost()

人们可以很容易地为 CLI 创建 MVC 应用程序 - 其中 POST 的概念实际上并不适用 - 使用不同的子类Zend_Controller_Request_Abstract作为其请求机制。

于 2012-04-05T14:14:28.937 回答