HTTPリクエストをコンテンツタイプに基づいて自動的に解析する
スリムフレームワーク for PHP 5 バージョン 1.6.0(現在開発ブランチ中)は、コンテンツタイプに基づいてHTTPリクエストボディを自動的に解析する新しいミドルウェアを導入しています。このミドルウェアはJSON、XML、またはCSVのコンテンツタイプを含むHTTPリクエストを解析します。このミドルウェアを有効にするには、これを実行します。
$app = new Slim();
$app->add(new Slim_Middleware_ContentTypes());
SlimアプリケーションにSlim_Middleware_ContentTypesミドルウェアを追加すると、Requestオブジェクトのbodyプロパティは適切に解析されます。ただし、スリムアプリケーションの環境配列のキーslim.input_original
を使用して、生の未解析のリクエストボディをいつでも取得できます。
JSONリクエスト
このミドルウェアはJSONリクエストのボディを連想配列に解析します。以下のPOSTルートにHTTPリクエストを送信するとします。リクエストボディは {"name":"John","email":"john.doe@gmail.com"}
です。
$app->post('/book', function () use ($app) {
$body = $app->request()->getBody();
}
この例では、$body変数は array('name' => 'John', 'email' => 'john.doe@gmail.com')
と等しくなります。
XMLリクエスト
このミドルウェアはSimpleXML拡張子が利用できる場合、XMLリクエストのボディをSimpleXMLElementインスタンスに解析します。そうでなければ、ボディは文字列のままになります。上記のPOSTルートにHTTPリクエストを送信するとします。HTTPリクエストボディは
<book>
<id>1</id>
<title>Sahara</title>
<author>Clive Cussler</author>
</book>
変数$body
はSimpleXMLElementのインスタンスになります。POSTされたbookプロパティを$body->id
、$body->title
、または$body->author
を使用して取得できます。
CSVリクエスト
このミドルウェアはCSVリクエストのボディを配列または配列の配列に解析します。上記のPOSTルートにHTTPリクエストを送信するとします。HTTPリクエストボディは
Doe,John,john.doe@gmail.com
Doe,Jane,jane.doe@gmail.com
変数$body
はこの配列になります
array(
array('Doe','John','john.doe@gmail.com'),
array('Doe','Jane','jane.doe@gmail.com')
);
カスタムコンテンツタイプ
JSON、XML、またはCSV以外のリクエストボディを解析したい場合は、その省略可能な第2引数を使用して独自の解析関数をこのミドルウェアに提供できます。着信HTTPリクエストのコンテンツタイプを知る必要があり、リクエストボディを解析する呼び出し可能なアイテムを用意する必要があります。HTTPリクエストボディを解析する呼び出し可能なアイテムは文字列引数を受け取り、適切なPHPデータ構造を返す必要があります。
上記のPOSTルートがHTMLボディを含むHTTPリクエストを受け入れることを想像してみてください。Slim_Middleware_ContentTypesミドルウェアにリクエストをこのように解析するように指示します
function parseHtml( $rawBody ) {
$dom = new DOMDocument();
$dom->loadHTML($rawBody);
return $dom;
};
$app = new Slim();
$app->add(new Slim_Middleware_ContentTypes(array(
'text/html' => 'parseHtml'
)));
上記で定義したPOSTルートの引き続き使用を前提に、$body
変数はHTTPリクエストボディで提供されたHTMLを表すDOMDocumentインスタンスになります。定義したカスタム解析関数は(コンテンツタイプでキー付けした)デフォルトの解析関数とマージされます。この例では、Slim_Middleware_ContentTypesミドルウェアはJSON、XML、CSV、またはHTMLのコンテンツタイプを含むHTTPリクエストを解析するようになります。
JSONリクエストのデフォルトの解析関数をオーバーライドしたい場合は、コンテンツタイプapplication/json
に対して新しいパーサーを定義します。すると、独自パーサーがデフォルトパーサーの代わりに使用されます。