データ アクセスに Doctrine を利用するビジネス ルールで構成されるモデル レイヤーを作成する次のアプローチについて、フィードバックをお寄せください。
私の現在のアプローチは、Model が ContainerAware クラス/オブジェクトであり、ライブラリ以外のビジネス固有のドメイン ロジックがすべて含まれているという概念に基づいています。
このように物事を行うには、フレームワークを叩く必要があることがわかりました。そのため、私の脳の一部が私のアプローチに疑問を呈しています。
私は現在 Symfony 2 を使用しています。これは、最新のすべての PHP MVC フレームワークと同様に、Doctrine 2 のような ORM レイヤーを利用し、必然的にそれをモデル レイヤーと見なします。ZF2でも状況は似ていると思いますので、私の例はSF2で書かれていますが、これはフレームワークにとらわれない質問と考えてください。
具体例
具体的な例として、次のシナリオを考えてみましょう。
メッセージ要件
- ユーザーとして、自分に属するメッセージを作成できます。
- ユーザーとして、自分に属するメッセージを更新できます。
- ユーザーとして、自分に属するメッセージをアーカイブできます。
コントローラー
Symfony2 では、これらの要件はコントローラー層のアクションとしてコード化されています。 メッセージが実際にユーザーに属しているかどうかをチェックする余分なコードはスキップしますが、明らかに、これもドメイン ロジックの一部である必要があります。メソッド「belongsToUser」など。
// Vendor\MessageBundle\DefaultController
public function archiveAction(Request $request) {
// ...
$em = $this->getDoctrine()
->getManager();
$message = $em->getRepository('MessageBundle:Message');
->getManager()
->getRepository('MessageBundle:Message')
->find($request->get('id'));
$message->setIsArchived(true);
$em->persist($entity);
$em->flush();
$this->flashMessage('Message has been archived.');
// ...
}
モデル
これをモデルに入れると、次のようになります。
class MessageModel
{
public function archive($messageId) {
// ...
$em = $this->getDoctrine()
->getManager();
$message = $em->getRepository('MessageBundle:Message')
->find($messageId);
$message->setIsArchived(true);
$em->persist($entity);
$em->flush();
// ... return true on success, false on fail.
}
}
改訂されたコントローラー
改訂されたコントローラーは次のようになります。
// Vendor\MessageBundle\DefaultController
public function archiveAction(Request $request) {
// ...
$model = new MessageModel(); // or a factory.
$result = $model->archive($request->get('id'));
if($result) {
$this->flashMessage('Message has been archived.');
} else {
$this->flashMessage('Message could not be archived due to a system error.');
}
return array('result'=>$result);
// ...
}
他の 2 つの要件もモデルに実装されます。
一言で言えば私のアプローチ
一言で言えば、これは私の現在のアプローチです:
- コントローラー- 少ないロジック
- ビュー- 同じまま
- モデル- コンテナを認識し、すべてのビジネス ロジックを収容し、Doctrine にデータ アクセスとしてアクセスします。
- ORM - モデル層の一部と見なされますが、モデル層とは見なされません。
- サービス レイヤー- 必要に応じて、サービス レイヤーを使用して複数のレイヤーを操作できますが、構築しなければならなかったアプリケーションの性質が単純であるため、サービス レイヤーを使用する必要があるのはごくわずかであることがわかりました。 .
私の質問
- 私のアプローチは、他の人が行っていることと一致していますか?
- 明らかに明らかな何かが欠けていますか?
- これに似たものを試してみて、良い/悪いと感じましたか?
前もって感謝します。