私はコードをテスト可能な状態に保ち、現在のMVCフレームワークの依存性注入戦略を採用することを決定しました。
しかし、デザインパターンのマスターから遠く離れているため、データベースコネクタクラスからモデルを可能な限り疎結合に保つための良い方法を理解するのに苦労しています。
これはどのように行うことができますか?
この質問では物理的なコードを提供していなかったので、上記の問題を理解する方向に私を導くことができるいくつかのロジック/コードの例または情報に本当に感謝します。
1つの方法は、データベースを設計する前にモデルを設計することです。モデルを設計する際の焦点は、問題のドメイン内のビジネスロジックと意味を把握することです。これは、エンティティとデータフィールドだけでなく、ビジネスにとって意味のある方法でキャプチャする必要があります。一部のデータ要素は他の要素から解釈され、一部は他の要素に依存します。さらに、特定の要素が特定の値に設定されたときのオブジェクトの内部的な応答など、必要な基本ロジックをこのモデルに追加します。
最終的には、データを永続化する方法と90 +%同一の結果になる可能性が高くなります。それはいいです。結合しなくても完全に同一にすることができます。
真の永続性の無知の霧の中でドメインをモデル化することは、ソフトウェア設計にとってちょっとした聖杯であることにも注意してください。できれば素晴らしいです。しかし、問題のドメインがまったく重要で複雑な場合は、データの永続性の健全性チェックを行って、ペイントしていないことを確認するために、時々ドメインモデリングから後退することをお勧めします。コーナーに自分自身。
さまざまなコンポーネントの実際の役割を覚えておいて、それらを設計するときはそれらの役割を分離してください。与えられた設計上の決定について、それらの役割のいずれかに違反していないかどうかを自問してください。
あなたは二つのものを持ちたいと思っています。
「ドメインモデル」またはデータエンティティ。これらは、ユーザー、投稿、製品など、システムのエンティティを表します。
class PPI_Model_User {
protected $_conn = null;
function __construct(array $options = array()) {
if(isset($options['dsnData'])) {
$this->_conn = new PPI_DataSource_PDO($options['dsnData']);
}
}
function getAll() {
$rows = $this->_connect->query("SELECT .....")->fetchAll();
$users = array();
foreach($rows as $row) {
$users[] = new PPI_Entity_User($row);
}
return $users;
}
}
使用法コード
$model = new PPI_Model_User(array('dsnData' => $dsnData));
$users = $model->getAll();
foreach($users as $user) {
echo $user->getFirstName();
}
これで、ドメインモデル(エンティティ)を作成し、MVCモデルでDB接続とデータ操作を行うことができます。
PPIとは何か、 "PPIフレームワーク"をググってください。
検索で頑張ってください。
よろしく、ポールDragoonis。
MVCはSmalltalkで発生したことを覚えておいてください。Smalltalkはすべてのオブジェクトに対して自動永続性を備えています。そのため、MVCパターンはモデルと永続性の分離のソリューションを規定していません。
私の好みは、データベースからモデルオブジェクトを作成し、モデルオブジェクトをデータベースに格納する方法を知っている「リポジトリ」オブジェクトを提供することです。次に、モデルは永続性について何も知りません。ただし、一部のユーザーアクションでは保存をトリガーする必要があるため、コントローラがリポジトリを認識している可能性があります。私は通常、ある種の依存性注入を使用して、コントローラがリポジトリに結合されないようにします。