0

一方のコントローラーのアクションメソッドから呼び出しthe Forward pluginて、もう一方のコントローラーのアクションメソッドから値を取得します。

namespace Foo/Controller;

class FooController {

    public function indexAction() {

        // I expect the $result to be an associative array,
        //    but the $result is an instance of the Zend\View\Model\ViewModel
        $result = $this->forward()->dispatch('Boo/Controller/Boo', 
                                              array(
                                                  'action' => 'start'
                                             ));
    }
}

そして、Booこれが私が適用するコントローラーです:

namespace Boo/Controller;

class BooController {

    public function startAction() {

        // I want this array to be returned,
        //     but an instance of the ViewModel is returned instead
        return array(
            'one' => 'value one',
            'two' => 'value two',
            'three' => 'value three',
        );
    }
}

そして私がprint_r($result)それがページのViewModelである場合error/404

Zend\View\Model\ViewModel Object
(
    [captureTo:protected] => content
    [children:protected] => Array
        (
        )

    [options:protected] => Array
        (
        )

    [template:protected] => error/404
    [terminate:protected] => 
    [variables:protected] => Array
        (
            [content] => Page not found
            [message] => Page not found.
            [reason] => error-controller-cannot-dispatch
        )

    [append:protected] => 
)

何が起こっている?この動作を変更して、必要なデータ型を取得するにはどうすればよいthe Forward pluginですか?

UPD 1

今のところここでこれだけが見つかりました:

MVCは、これを自動化するために、コントローラーのリスナーをいくつか登録します。1つ目は、コントローラーから連想配列を返したかどうかを確認します。その場合、ビューモデルを作成し、この連想配列を変数コンテナにします。このビューモデルは、MvcEventの結果を置き換えます。

そして、これは機能しません:

$this->getEvent()->setResult(array(
                'one' => 'value one',
                'two' => 'value two',
                'three' => 'value three',
            ));

return $this->getEvent()->getResult();  // doesn't work, returns ViewModel anyway

つまり、配列だけを取得する代わりに、変数をに入れてViewModel、を返し、ViewModelそれらの変数をから取得する必要がありますViewModel。とても良いデザインだと言えます。

4

1 に答える 1

2

ZF2 のアクションでビューを無効にする必要があります。次の方法でこれを行うことができます。

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;

class IndexController extends AbstractActionController
{
    public function indexAction()
    {
        $result = $this->forward()->dispatch('Application/Controller/Index', array( 'action' => 'foo' ));
        print_r($result->getContent());
        exit;
    }

    public function fooAction()
    {
        $response = $this->getResponse();
        $response->setStatusCode(200);
        $response->setContent(array('foo' => 'bar'));
        return $response;
    }
}
于 2012-12-12T21:12:19.930 に答える