モデルレイヤーには、データマッパー、ドメインオブジェクト、および「サービス」(モデルレイヤーの外部に接続するため)があります。DomainObjectFactoryとDataMapperFactoryを実装することを選択したため、DM<->DOの関係に固執しました。理想的には、データマッパーは「get」/「read」を実行するすべてのメソッドに対して関連するドメインオブジェクトのインスタンス(またはインスタンスの配列)を返しますが、データマッパーはドメインオブジェクトファクトリにアクセスできません。
DMとDOのファクトリパターンがないと、オートローダーがDM内を引き継いで、DOのインスタンスを作成できます。しかし、これは工場でどのように達成されますか?
私が考えることができる1つの可能な解決策は、関連するドメインオブジェクトのインスタンスをデータマッパーメソッドに渡すことです。
$user = $this->domainObjectFactory->build('user');
$mapper = $this->dataMapperFactory->build('userMapper');
//Pass an [empty] user DO to the DM, which will be returned back
$mapper->getById($someIDValue, $user);
このオプションは非常に汚いようですが、単一のgetメソッドでは機能します。ただし、ドメインオブジェクトの配列を返す場合は意味的にオフザレールになるため、これを実現するための最善の方法ではないことは明らかです...別のオプションは、データマッパーがドメインオブジェクトファクトリにアクセスできるようにすることです。しかし、それは大規模なLOD/SRP違反になります。
つまり 、データマッパーがドメインオブジェクトファクトリにアクセスして、ドメインオブジェクトを返すことができるようにするにはどうすればよいでしょうか。