localdisk

PHP とか Java とか Web とか好きなことを書きます。

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 を楽しんでください。