0

getList アクションが次のように実装されている Zend Framework 2 と AbstractRestfulController を使用します。

public function getList() {
    return new ViewModel(array(
        'entities' = array(1 => array(/*..*/), 2 => array(/*..*/))
    ));
}

JsonStrategy をビュー マネージャーに追加したので、UA がAccept: text/htmlZF2 を送信すると、正しいビューを使用してデータがフォーマットされます。私のUAがAccept: application/jsonZF2を(正しく)送信するapplication/jsonと、JSONがデータをエンコードして応答します。

しかし今では、すべてのエンティティが「コンテンツ」ノード (ViewModel::$captureToプロパティ) 内にラップされています。

アクション コントローラーが JsonModel を返す場合、これを回避できます。しかし、JsonStrategy は、Accept をチェックせずに、常に application/json で応答します。

JsonModelではなくViewModelを使用している間にそれを回避する方法はありますか?

4

2 に答える 2

1

解決策を得るために、私は次のようなことをします:

1 - 新しい MasterControllerClass を作成します。新しいコントローラーは「MasterControllerClass を拡張します」

abstract class MasterControllerClass extends AbstractActionController 
private $_jsonFlag = false;

public function onDispatch(MvcEvent $e)
{
    $this->preDispatch($e);
    $action = parent::onDispatch($this->getEvent());
    $this->postDispatch($e);
    return $action;
}

public function postDispatch(MvcEvent $e)
{
    $this->_jsonFlag ?: $this->viewConfig($e);
}

public function json($value, $sucess = true)
{
    $this->_jsonFlag = true;
    return new \Zend\View\Model\JsonModel(array(
        'data' => $value,
        'success' => $sucess,
    ));
}

2 - 私のコントローラーでは、$this->json('values to pass to javascript', true or false, true == success, false == fail) を呼び出します

これで問題は解決しました。json を JavaScript に渡すことができるようになりました。

于 2012-11-08T12:31:17.117 に答える
0

この問題はZendFramework2.0.4で対処されていますが、完全な方法ではありません。acceptableViewModelSelector彼らは、次のように使用できるという新しいコントローラープラグインを追加しました。

class SomeController extends AbstractActionController
{
    protected $acceptCriteria = array(
        'Zend\View\Model\JsonModel' => array(
            'application/json',
        ),
        'Zend\View\Model\FeedModel' => array(
            'application/rss+xml',
        ),
    );

    public function apiAction()
    {
        $viewModel = $this->acceptableViewModelSelector($this->acceptCriteria);

        // Potentially vary execution based on model returned
        if ($viewModel instanceof JsonModel) {
            // ...
        }
    }
}

JsonModelの作成を選択すると、「コンテンツ」ラッパーなしで応答が正しくレンダリングされます。コントローラのビューロジックを回避できるように、より洗練されたソリューションを望んでいましたが、問題に直接対処するための修正は作成されていませんでした。

于 2012-11-28T12:03:44.570 に答える