在我自己的abstact库中返回控制器操作(Zend Framework)

时间:2012-06-10 18:10:23

标签: php zend-framework

你好我试图在我自己的库摘要中检索一个控制器动作返回的值,在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

1 个答案:

答案 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
}