ドメインオブジェクトとWeb API

データ形式ドメインオブジェクトを変換する際に起こる不一致

JSONドメインオブジェクトを単純に変換するだけでは、以下の不一致がある場合不都合になる。

関心事の不一致

ドメインオブジェクトの持つ全ての情報がAPIを利用する側で必要とは限らない。また、ドメインオブジェクトが期待するデータ項目がすべてPOSTされるとは限らない。

データ構造の不一致

APIで使うデータ形式はデータだけが関心事であるため、できるだけ単純な構造の方が使いやすくなる。データだけに注目した場合、ロジックの整理を重視したドメインオブジェクトの階層構造をそのまま階層的なデータ構造として表現することはあまり意味を持たない。

変換用の中間オブジェクト

以上の不一致が小さい場合はドメインオブジェクトとJSONの単純なマッピングで済ませることができるが、不一致が大きい場合は変換用の中間オブジェクトを用意したほうがコードをシンプルに保ちやすくなる。

レスポンスオブジェクト

レスポンス用のデータ形式に合わせたレスポンスオブジェクトを生成する。このクラスのファクトリメソッドが構造の違いを吸収する。

<?php

class BookResponse
{
   public static function build(Book $book)
   {
        // BookオブジェクトからBookResponseを生成する
        // ファクトリメソッド
   }
}
リクエストオブジェクト

HTTPでPOSTされたリクエストデータをリクエストオブジェクトにマッピングし、ドメインオブジェクトに変換する。

<?php

class BookRequest
{
    public function toBook()
    {
        // BookRequestからBookオブジェクトを生成する
    }
}