Response::xml macro を作ったよ
Laravel って json を返すメソッド Response::json
は用意されてるんだけど、XML を返すメソッドは用意されていない。API を作成しなければならない場合、いささか困る部分ではあります。なので作ってみた。
まず、 app
の下に macros.php
というファイルを作って下のコードをコピーしてください。
<?php // macros.php Response::macro('xml', function(array $vars, $status = 200, array $header = [], $xml = null) { if (is_null($xml)) { $xml = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><response/>'); } foreach ($vars as $key => $value) { if (is_array($value)) { Response::xml($value, $status, $header, $xml->addChild($key)); } else { $xml->addChild($key, $value); } } if (empty($header)) { $header['Content-Type'] = 'application/xml'; } return Response::make($xml->asXML(), $status, $header); });
gist も貼っておきますね。
Response::xml macro
Laravel 4.1 から Response
クラスにも macro
が定義できるようになりましたので、このように楽に作ることができます。
で、その次に作成した macros.php
を使えるようにします。app/start/global.php
を開いて一行追加します。
<?php // global.php require app_path() . '/macros.php';
準備は完了しました。使い方としてはこのようになります。
<?php // routes.php Route::get('api.{ext}', function() { $data = ['status' => 'OK']; $ext = File::extension(Request::url()); return Response::$ext($data); })->where('ext', 'xml|json');
拡張子で判定して xml/json
のどちらかを出力するコードです。where
メソッドで拡張子は xml/json
のどちらかしか許可されません。これ以外の文字を入力すると HttpNotFoundException
が発生します。
Laravel を楽しんでください。