【パーサークラス実装】

はじめに

パーサークラスは、REST-API サーバーにおけるHTTP ボディ部の解析を担当する重要なコンポーネントです。
HTTP ヘッダの Content-Type に応じて適切なパース処理を実行し、イベント処理クラス(UNIT)からは $ctx->request()->body() を通じてパース済みデータを取得できます。

このページでは、パーサークラスの生成方法、構造、役割、ビルトインパーサーとの関係について解説します。

スキャフォールディング(生成方法)

パーサークラスは以下のコマンドで生成できます。
php worker custom:parser <カスタム名>
                    

生成ファイルは app/BodyParser/<カスタム名>.php に配置されます。
生成されるクラスは BodyParser を継承した最小構成で、必要に応じてメソッドを追加して利用します。

その他スキャフォールディングの詳細は ▶スキャフォールディング を参照してください。

生成されるクラスの構造

スキャフォールディングで生成されるパーサークラスは次のような内容です。
<?php
/**
 * ボディ部パーサークラスのファイル
 */

namespace App\BodyParser;

use App\Common\RequestWrapper;

class <カスタム名> extends BodyParser
{
    public function selector(RequestWrapper $p_request, string $p_endpoint): ?string
    {
        return 'normal';
    }

    public function normal($p_body)
    {
        return $p_body;
    }
}
                    

  • BodyParser を継承することで REST-API サーバーのパーサーとして認識される
  • メイン処理クラスの $setting_files['parser'] に設定された設定ファイルと連動する(▶パーサー設定
  • Content-Type ごとに設定ファイルでパーサークラスを指定することで適用される

パーサークラスの役割

パーサークラスは主に以下の用途で利用されます。

  • HTTP ボディ部のパース処理
  • Content-Type に応じた解析ロジックの切り替え
  • UNIT パラメータへ渡すデータの整形
  • エンドポイントごとの特別な処理分岐

REST-API の入力処理を一元化することで、イベント処理クラス側の実装をシンプルに保つことができます。

selector メソッド

selector メソッドは、リクエスト情報やエンドポイント URI を参照して、どのメソッドでパース処理を行うかを決定する仕組みです。

  • 戻り値としてメソッド名(文字列)を返す
  • 返されたメソッドが実行される
  • selector が未定義の場合は normal メソッドが自動で呼び出される

同じ Content-Type に対して複数の処理を用意し、状況に応じて切り替える柔軟な構造になっています。

normal メソッド

selector が未定義、または null を返した場合に実行されるデフォルト処理です。
特別な解析が不要な場合は normal のみで十分です。

ビルトインパーサー

REST-API サーバーには、主要な Content-Type に対応したビルトインパーサーが用意されています。
対応付けは setting/parser.php にて定義されています(▶パーサー設定)。

● application/json → JsonParser

JSON 文字列を連想配列へ変換するパーサーです。
public function normal($p_body)
{
    return json_decode($p_body, true);
}
                    

● application/x-www-form-urlencoded → UrlencodedParser

URL エンコードされたボディを配列へ変換します。
public function normal($p_body)
{
    parse_str($p_body, $parsed_body);
    return $parsed_body;
}
                    

● application/xml → XmlParser

XML を SimpleXML で読み込み、配列へ変換します。
public function normal($p_body)
{
    $xml = simplexml_load_string($p_body);
    return json_decode(json_encode($xml), true);
}
                    


おわりに

パーサークラスは REST-API の入力処理を担う重要なクラスです。
Content-Type ごとの解析処理を整理し、必要に応じて selector を活用することで、柔軟で拡張性の高い API を構築できます。

ビルトインパーサーの実装も参考にしながら、プロジェクトに適したパーサーを設計してください。