下面的方法如何运作?
$this->getRequest()->getPost();
班级getPost()
中没有方法Zend_Controller_Request_Abstract
,但它如何运作?在OOP原则中,方法getPost()
应出现在Zend_Controller_Request_Abstract
。
如果没有直接实例,Zend如何在类getPost()
中提取Zend_Controller_Request_Http
?
谢谢。
答案 0 :(得分:2)
getPost()
是扩展Zend_Controller_Request_Http
的{{1}}类的一部分。
答案 1 :(得分: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 here
的更多信息进一步回答您的问题
/**
* Return the Request object
*
* @return Zend_Controller_Request_Abstract
*/
public function getRequest()
{
return $this->_request;
}
这就是Zend / Controller / Action.php中的内容 - 这里的评论说Zend_Controller_Request_Abstract'是-a '返回类型。我突出显示'is-a',因为它可以返回任何'是-a'Zend_Controller_Request_Abstract的类。要了解更多信息,请查看此wikipedia页面
“在知识表示,面向对象的编程和设计中, is-a或is_a或是(包含)是一个类D的关系 是另一个B类的子类(因此B是D的超类)。“
答案 2 :(得分:1)
虽然我已经投票决定关闭这个问题(“这个问题可能会征求意见,辩论,争论,民意调查或扩展讨论”),但我认为你提出了一个有趣的观点。我认为ZF开发团队可以如下辩护:
就框架而言,Action只需要实现Zend_Controller_Action_Interface
,这实际上只是dispatch()
方法。该框架提供了一个抽象实现类Zend_Controller_Action
,我们作为userland app开发人员通常会扩展以定义我们的操作方法等。但是该类中没有任何内容实际上需要Zend_Controller_Request_Http
的实例。框架代码中没有$request->getPost()
的内在依赖性。只有在用户空间,我们的应用程序开发人员才会使用创建Zend_Controller_Request_Http
实例的默认调度流,这样我们就可以通过getPost()
方法访问POST。
可以轻松地为CLI创建MVC应用程序 - 其中POST的概念确实不适用 - 使用Zend_Controller_Request_Abstract
的不同子类作为其请求机制。