PHP から XML コンバーター
PHP のクラスやオブジェクトを貼り付けるだけ。きれいな XML が返ってきます。
このツールでできること
PHP の SoapClient 呼び出し用 XML ペイロード、WordPress プラグインのエクスポート、XML をいまだに要求してくる古いパートナー連携のために、手作業で XML を組み立てた経験があれば、その面倒さはよく分かるはず。ここに PHP を貼り付ければ、一発で整形済みの XML が返ってきます。コンストラクタプロモーション付きの 1 クラスでも、value object をまとめたファイルでも、値が入ったインスタンスでも同じ結果:すべてのプロパティを保持した完全な XML ドキュメントになります。
単純な文字列置換ではありません。モダンな PHP 8+ をきちんと読みます。コンストラクタで昇格されたプロパティは宣言済みプロパティと同じ扱い、readonly フィールドは通常の要素として出力、型付きプロパティ(string、int、float、bool)は型を保持し、DateTimeInterface の値は ISO-8601 文字列で出力、null は省略せず空要素になり、配列は 1 エントリ 1 子要素のコンテナ要素になります — SimpleXMLElement や DOMDocument が普通に出してくるのと同じ形です。
クラス構造とメタデータも尊重します。トップレベルのクラスはクラス名をつけたルート要素になり、public プロパティは宣言順で子要素になり、ネストされた value object はインライン展開され、array プロパティはラッパー要素になります。#[XmlRoot("x")] のような PHP 属性や @XmlElement("x") のような docblock タグで要素名を指定すれば、そのとおりリネームされます。Laravel の Eloquent モデル、Symfony Serializer の DTO、ただの value object を貼り付ければ、手書きの SoapVar や SOAP リクエストボディと同じような XML が出てきます。
使い方
3 ステップ。1 つのクラスでも <code>src/Entity</code> フォルダ丸ごとでも流れは同じです。
PHP を貼り付ける(またはサンプルを試す)
左のエディタにそのまま PHP を貼り付けてください。コンストラクタプロモーション付きのクラス、readonly の value object、複数クラス、値入りのインスタンス — どれでも OK。まず サンプルを読み込む をクリックして、実用的な Order の例を見てみてください。
<?php タグを消したり、名前空間を削ったり、docblock を削除したりする必要はありません。IDE で見えているままの形で大丈夫。そのまま貼り付けてください。
変換を押す
緑の 変換 ボタンをクリック。ツールが PHP を読み、すべてのクラスとプロパティを保ったまま、一発で XML を組み立てます。処理中は軽いシマーが表示されます。
XML をコピー
右ペインに、仕様に準拠した任意のパーサーが受け入れられるインデント付きの整形済み XML が入ります。SoapClient のリクエスト、PHPUnit のフィクスチャ、WordPress のエクスポートファイル、API ドキュメントのサンプルなどに貼り付けられます。
実際に役立つ場面
SoapClient リクエストのフィクスチャ作成
レガシーな SOAP エンドポイントに <code>SoapClient</code> で話しかけていて、PHP クラスと一致するリクエストボディが必要なとき。クラスを貼って XML を取り、<code>SoapVar</code> でラップするか <code>__doRequest()</code> に渡します。
WordPress/Drupal の XML エクスポート
カスタム投稿タイプのクラスや 20 フィールドある Drupal エンティティが、すぐに編集できる WXR/XML エクスポートテンプレートに変わります — PHP の形に合わせて要素構造を手で組む作業はもう不要。
Symfony/Laravel の XML レスポンス
API は基本 JSON を返すけれど、1 社だけまだ XML を欲しがっている。DTO を貼り付けて XML エンベロープを受け取り、Symfony Response や Laravel ResponseFactory の例に差し込んで、次の作業へ。
PHPUnit のフィクスチャとスナップショットテスト
ユニットテストの value object インスタンスを、結合テスト、コントラクトテスト、モック SOAP サーバー用の XML フィクスチャファイルに変換 — 目分量で対応する XML テンプレートを手書きする必要はありません。
よくある質問
コンストラクタプロモーションや readonly プロパティには対応していますか?
対応しています。コンストラクタで昇格されたパラメーター(__construct 内の public string $orderId)は、宣言済みプロパティと同じように子要素になります。readonly はシリアライズ時に通常のプロパティと同じ扱い — XML は同一です。PHP 8.2 の readonly class も動きます。
複数のクラスを一度に貼り付けられますか?
はい — エンティティフォルダ全体でも、複数クラスを含む 1 ファイルでも貼り付け可能です。各トップレベルクラスは、ネストされた型を展開し、親クラスのプロパティも取り込んだ形で出力されます。トレイトもプロパティを提供する扱いになります。黙って落とされるものはありません。
DateTime、null、float、bool はどう扱われますか?
DateTimeInterface のインスタンス(DateTime、DateTimeImmutable)は ISO-8601 文字列で出力されます。null は省略せず空要素(<field/>)になり、XML の形が常に一貫します。float はロケール依存の区切り文字を使わないプレーンな小数表記、bool は true/false のテキストとしてシリアライズされます — SimpleXMLElement が出力するのと同じ形です。
配列やネストされたオブジェクトはどうなりますか?
配列プロパティは、1 エントリ 1 子要素のコンテナ要素になります。/** @var OrderItem[] */ public array $items は <items><OrderItem/><OrderItem/></items> になります。連想配列は文字列キーを要素名として使います。ネストされた value object はインライン展開され — DOMDocument がツリーを組むのと同じ流れです。
コードは保存されますか?
PHP は変換のためにバックエンドに送られますが、保持はされません — ペイロードはログに残しません。いつものオンラインツール同様、本当にセンシティブなリテラル(DB パスワード、API キーなど)がコードに含まれている場合は、貼り付ける前にマスクするかモックに置き換えてください。
マジックメソッドや動的プロパティを使っている場合は?
動的プロパティ(__set や stdClass キャストでランタイムに追加されるもの)やマジックゲッター(__get)は、静的コードだけからは推測できません。ツールが読むのは宣言済みプロパティ、コンストラクタで昇格されたパラメーター、明示的な代入です。__get 経由でしか存在しないフィールドは、プロパティとして宣言してあげれば、コンバーターが拾えます。
一緒に使えそうな他のツール
PHP から XML はパズルの 1 ピース。これらのツールと組み合わせるとスムーズです: