Who convert a model into Json?

最近、よく疑問に思います。

モデルクラスをJsonに変換してHTTPレスポンスで返すときに、Jsonに変換をする役割を持つのは誰なんでしょう? モデル自身?コントローラー?ビュー?

A model convert

気の利いたフレームワークを見ると大抵モデルクラス自身がJsonに変換する役割を持ってます。 例えばLaravelなんかだと

class User extends Eloquent {
    protected $table = 'users';
}

というモデルクラスを作り

$user->toJson()

というように、モデル自身が自身をJsonに変換します。 単純にモデルをそのままJson化する場合はこれで問題ありませんが、特定のカラムは出力制御をしたり、フォーマットをすると難しくなります。

同じモデルをJson化するにしても、リクエストによって出力する項目が変わることがあります。

http://example.jp/users
http://example.jp/admin/users

あまり良い例ではありませんが、同じユーザーを返すレスポンスでも、一般ユーザー向けのレスポンスと管理者向けのレスポンスでは返して良い内容が変わります。 一般公開されているAPIと、システムの内部で使用するAPIなんかではなおさら返して良い内容が変わります。

こう考えると、リクエストによって変わるため、Json化をするのはコントローラーでやるのが良いように思えます。

A controller convert

それでは、コントローラーでJson化することについて考えてみます。 FuelPHPなんかはこのタイプでController_RestでJson化を行っています。

class Controller_Users extends Controller_Rest
{
    public function get_user()
    {
        $user = Model_User::find(1);
        $this->response(array(
            'id' => $user->id,
            'name' => $user->name,
            'createdAt' => (new DateTime($user->createdAt)->format('Y-m-d H:i:s')
        ));
    }
}

上記のようにすればリクエストに応じてレスポンスの内容を変更することができます。

でも、これってコントローラーでやることなのでしょうか? コントローラーの役割はモデルからデータを取得して、ビューに渡すことだと考えると、コントローラーで出力するデータの制御をしたり、フォーマットすることに違和感があります。 出力の制御を行うのはビューの役割なので、ビューでやるべきように思えます。

A view convert

それならと、ビューでJson化することについて考えてみます。 HTMLなんかではビュークラスとテンプレートエンジンで出力するので同じようにJsonを出力すると良さそうです。

と思ったのですが、Jsonをそういった方法で出力しているのを見たことがありません。 ということは、たぶんこのやり方は間違ってるのでしょうね。


一体、Jsonに変換するのは誰の役割なのでしょうか?