Zend Framework 2 では、コンテンツ ネゴシエーションはビュー レイヤーで行われますが、これにはかなり満足しています。私のコントローラーの例:
public function viewAction()
{
$id = $this->params('id');
$user = $this->getRepository()->findUser();
return new ViewModel(array(
'user' => $user,
));
}
これにより、view.phtml テンプレートがレンダリングされて html が返されるか、ユーザー オブジェクトが JSON 応答に変換されます。いわゆるビュー戦略は、リクエストに基づいてレスポンスをレンダリングする方法を決定します。
私の webapp での「REST」アプリケーション フロー
このタイプのコンテンツ ネゴシエーションは、多くのユース ケースで非常にうまく機能します。
/user
またはindexAction()
、ユーザーの配列を返します => JSON の html が可能です。/user/1
またはviewAction()
ユーザーオブジェクトを返します=> htmlまたはJSONが可能です(上記の例);/user/1/update
またはupdateAction()
htmlフォームを返します。エラーが存在する場合、この URL への POST は html または JSON を返します。または、成功するとリダイレクトされviewAction()
、ユーザーの新しいバージョンが返されます => html と JSON が再び可能になります。/user/create
またはcreateAction()
htmlフォームを返します。エラーが存在する場合、この URL への POST は html または JSON を返します。または、成功するとviewAction()
、作成されたばかりのユーザーにリダイレクトされます => html と JSON が再び可能になります
私の質問
コントローラー層でコンテンツ ネゴシエーションが「必須」となるユース ケースがいくつかあります。いくつかの可能性を見落としているかどうかはわかりません。たとえば、次の場合に使用できるオプションはありますか?
- ユーザーの削除: に POST します
/user/1/delete
。HTML ビューの場合は、ユーザーのリストにリダイレクトされます (削除されたユーザーは表示されません)。JSON 応答が必要な場合は、200 OK と、削除が成功したというメッセージを含む JSON オブジェクトを返します。 - ブログ記事にコメントを投稿します。HTML ビューの場合、コメントが追加されている投稿にリダイレクトされます。JSON 応答を要求する場合は、200 OK と、配置したばかりのコメントを含む JSON オブジェクトを返す必要があります。
私の目標は、ビュー レイヤーに既に存在するコンテンツ ネゴシエーションを複製しないことです。また、2 つの可能な応答 (JSON と html) があるため、コントローラーがより太くなりますが、それが唯一のケースではない可能性があります。後で XML や別の形式をサポートしたい場合は、それらの応答タイプのすべてのアクション スイッチを用意します。