4

Zend Framework 2では、HTTPacceptヘッダーが「application/ json」に設定されている場合はJSONを返し、それ以外の場合はHTMLを返します。2.0.4変更ログacceptableViewModelSelectorの例と同じように、新しいコントローラープラグインを使用しています。

私は次のコードを持っています:

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

    public function jsonAcceptHeaderAction() {
        $view_model = $this->acceptableViewModelSelector($this->acceptCriteria);

        return $view_model;
    }
}

次のようにacceptヘッダーを設定した場合:

curl -H "Accept: application/json" http://mydomain.com/json

JsonModel次に、コントローラープラグインは期待どおりにインスタンスを返します。ただし、acceptヘッダーにない場合でも、常にこれを行うようです。application/jsonたとえば、Chromeでページにアクセスすると、次のacceptヘッダーが送信されます。

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

を使用すると、JSONも返されますcurl http://mydomain.com/json。コントローラプラグインにはデフォルトのビューモデル名があります。これは、受け入れ基準に一致するものが見つからない場合に使用することを期待していました。変更ログには次のように記載されています。

上記は、基準が満たされていない場合は標準のZend \ View \ Model \ ViewModelインスタンスを返し、特定の基準が満たされている場合は指定されたビューモデルタイプを返します。

私は自分の受け入れ基準を次のように変更しようとしましたが、それは私が望むことをすることがわかりました。

private $acceptCriteria = array(
        'Zend\View\Model\ViewModel' => array('text/html'),
        'Zend\View\Model\JsonModel' => array('application/json'),
        'Zend\View\Model\FeedModel' => array('application/rss+xml')
    );

application/json理想的には、accept条件配列の最初のエントリを省略したいので、acceptヘッダーがないのに、なぜデフォルトのビューモデル名を使用しないのか疑問に思っています。

上記の変更を行わない限り、なぜ私が常にJsonModelオブジェクトを取得するのか誰かが知っていますか?

4

1 に答える 1

0

デフォルトのビューモデルは機能します。コードに問題はありません。text/htmlエントリがない場合、jsonを受け入れることができるブラウザでURLにアクセスすると、受け入れ基準は最初のエントリと一致します。つまり、application/jsonです。

デフォルトモデルが機能していることをテストするには、acceptableviewmodel配列にtext / htmlエントリを指定せずに、以下のようにcurlを使用してURLをテストすると、デフォルトのビューモデル出力が得られます。

curl -H "Accept: text/html" http://mydomain.com/json

これによりデフォルトのビューモデルが返されるため、エントリtext / htmlが必要であると期待どおりに機能するには、エントリを希望する順序で配列に配置します。

于 2012-12-26T06:04:30.270 に答える