コントローラーを使用してモデル データをプレーンなスカラーや配列に変換するのではなく、ビューがオブジェクト指向の方法でドメイン モデル オブジェクトにアクセスするようにすることをお勧めします。
これにより、コントローラーが肥大化するのを防ぐことができます。貧血ドメイン モデルのアンチパターンを参照してください。コントローラーは、どのモデルをインスタンス化するかを知る必要があるだけで、リクエスト入力をそのモデルに渡し、そのモデルをビュー スクリプトに挿入してレンダリングします。ドメイン モデルはデータ アクセス クラスではないことに注意してください。
ビュー ヘルパーを記述して、ドメイン モデル オブジェクトの一般的なレンダリングをカプセル化することもできるため、複数のビュー スクリプトで再利用できます。
ビューは、読み取り専用の方法でのみドメイン モデルにアクセスする必要があります。ビュー スクリプトは、ドメイン モデルに変更を加えようとしないでください。
View スクリプトで OO を簡単に使用できるようにするために、必要に応じて、ArrayObjectまたはその他の SPL タイプを実装するようにドメイン モデルを設計することもできます。
確かに、MVC と OO 設計全般を推進する大きな動機は、デカップリングです。他のレイヤーが変更されても、各レイヤーは変更されないようにしたいと考えています。公開 API を介してのみ、レイヤーが対話します。
ViewModel は、ビューを変更する必要がないようにモデルを抽象化する 1 つのソリューションです。私がよく使用するのは、テーブル設計などの詳細を抽象化し、データ アクセスよりもビジネスに重点を置いた API を提供するドメイン モデルです。したがって、基になるテーブルが変更された場合、ビューはそれを知る必要はありません。
たとえば、新しいタイプの属性を提供する必要があるなど、ドメイン モデルに変更があった場合、UI にその新しい属性を表示するために、View が変更されている可能性があります。
あるレイヤーを他のレイヤーから分離するためにどの手法を選択するかは、最も頻繁に発生すると予想される変更の種類と、これらの変更が本当に独立した変更になるかどうか、または複数のレイヤーへの変更が必要になるかどうかによって異なります。