0

こんにちは、Zend Framework のディスパッチ メソッドの 1 つで、自分自身のライブラリ アブストラクトのコントローラー アクションによって返された値を取得しようとしています。

私のコードは次のとおりです。

インデックスコントローラー

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

json に変換してから画面に出力するには、このライブラリの controllador で返された値を取得する必要があります。

ありがとう

4

1 に答える 1

0

ZF 1 では、コントローラー アクションから戻り値を取得する方法がありません。この値は、Zend Framework 自体によって使用または取得されることはありません。

Zend/Controller/Action.php516 行目 (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 では、コントローラー アクションの動作方法が変更されているため、戻り値が実際に意味を持つため、別のアプローチを考えた方がよいかもしれません。

現時点で考えられる最も簡単な方法は、コントローラーから値を返そうとする代わりに、後で取得できるレジストリ値を設定することです。

例えば

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
}
于 2012-06-10T19:08:00.960 に答える