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
オブジェクトを取得するのか誰かが知っていますか?