你好我试图在我自己的库摘要中检索一个控制器动作返回的值,在Zend Framework的一个调度方法中,我想知道这个专长是否可能,如果是这样的话。
我的代码如下:
的IndexController
class IndexController extends My_Controller
{
public function init()
{
/* Initialize action controller here */
}
public function indexAction()
{
// action body
return 'hello world';
}
}
My_Controller
abstract class My_Controller extends Zend_Controller_Action
{
/**
* Initialize Core_Controller
* @param Zend_Controller_Request_Abstract $request
* @param Zend_Controller_Response_Abstract $response
* @param array $invokeArgs
*/
public function __construct(Zend_Controller_Request_Abstract $request, Zend_Controller_Response_Abstract $response, array $invokeArgs = array())
{
parent::__construct($request, $response, $invokeArgs);
$this->_helper->viewRenderer->setNoRender();
}
public function preDispatch()
{
//something here
}
public function postDispatch()
{
//something here
}
public function dispatch()
{
//something here
}
}
我需要获取此库中controllador返回的值,以便将其转换为json,然后打印到屏幕。
Thnk
答案 0 :(得分:0)
在ZF 1中,无法从控制器操作中获取返回值。 Zend Framework本身从不使用或捕获此值。
查看Zend/Controller/Action.php
第516行(ZF 1.11.11),这是ZF调用您的控制器操作的点,并且未捕获或使用返回值。
public function dispatch($action)
{
// Notify helpers of action preDispatch state
$this->_helper->notifyPreDispatch();
$this->preDispatch();
if ($this->getRequest()->isDispatched()) {
if (null === $this->_classMethods) {
$this->_classMethods = get_class_methods($this);
}
// If pre-dispatch hooks introduced a redirect then stop dispatch
// @see ZF-7496
if (!($this->getResponse()->isRedirect())) {
// preDispatch() didn't change the action, so we can continue
if ($this->getInvokeArg('useCaseSensitiveActions') || in_array($action, $this->_classMethods)) {
if ($this->getInvokeArg('useCaseSensitiveActions')) {
trigger_error('Using case sensitive actions without word separators is deprecated; please do not rely on this "feature"');
}
$this->$action(); // <--- line 516 - this calls your action
} else {
$this->__call($action, array());
}
}
$this->postDispatch();
}
// whats actually important here is that this action controller is
// shutting down, regardless of dispatching; notify the helpers of this
// state
$this->_helper->notifyPostDispatch();
}
如您所见,控制器返回的值从未使用过。此外,在ZF2中,它们正在改变控制器动作的工作方式,因此返回值实际上具有意义,因此您可能想要考虑不同的方法。
目前我能想到的最快的事情就是尝试从控制器返回一个值,而不是设置一个可以在以后获取的注册表值。
e.g。
public function returnAction()
{
// ...
Zend_Registry::set('controller_return_value', 'hello world');
}
然后在您的插件中或者您想要获取值的任何地方:
try {
$retval = Zend_Registry::get('controller_return_value');
} catch (Zend_Exception $ex) {
$retval = null; // no return value set by controller
}