多くの投稿とStack Overflowリソースを読んだ後、私は「ビジネスロジックをどこに置くべきか」という有名な質問についていくつかの問題が残っています。 StackOverflow QuestionとA Blog Postを読むと、私はコード分離の問題をよく理解していると思います。Symfony2にビジネスロジックを配置する場所は?
データベースに追加されるユーザーを追加できるWebフォームがあるとします。この例では、これらの概念が含ま:
- フォーム
- コントローラ
- エンティティ
- サービス
- リポジトリを、私は何かを逃さなかった場合は、あなたが持つエンティティを作成する必要が
いくつかのプロパティ、getter、setterなどをdbに永続させるために使用します。そのエンティティを取得または書き出したい場合は、entityManager
を使用し、「非標準的な」クエリの場合はentityRepository
(「クエリ言語」クエリに適合する)を使用します。
これで、すべてのビジネスロジックに対してサービス(「遅延」インスタンスを持つPHPクラス)を定義する必要があります。これは "重い"コードを置く場所です。アプリケーションをアプリケーションに記録したら、ほぼすべての場所で使用でき、コードの再利用などが必要になります。
フォームをレンダリングして投稿するときは、フォームをエンティティ(もちろん制約条件)とバインドし、上で定義したすべての概念を使用してまとめます。
がpublic function indexAction(Request $request)
{
$modified = False;
if($request->getMethod() == 'POST'){ // submit, so have to modify data
$em = $this->getDoctrine()->getEntityManager();
$parameters = $request->request->get('User'); //form retriving
$id = $parameters['id'];
$user = $em->getRepository('SestanteUserBundle:User')->find($id);
$form = $this->createForm(new UserType(), $user);
$form->bindRequest($request);
$em->flush();
$modified = True;
}
$users = $this->getDoctrine()->getEntityManager()->getRepository('SestanteUserBundle:User')->findAll();
return $this->render('SestanteUserBundle:Default:index.html.twig',array('users'=>$users));
}
"新-meが" このようにコードをリファクタリングしています:
public function indexAction(Request $request)
{
$um = $this->get('user_manager');
$modified = False;
if($request->getMethod() == 'POST'){ // submit, so have to modify data
$user = $um->getUserById($request,False);
$form = $this->createForm(new UserType(), $user);
$form->bindRequest($request);
$um->flushAll();
$modified = True;
}
$users = $um->showAllUser();
return $this->render('SestanteUserBundle:Default:index.html.twig',array('users'=>$users));
}
$um
がある
ので、 "古い-meが" このように、コントローラのアクションを記述します#1コード片から#2コード片まで見ることができないすべてのコードが保存されているカスタムサービス。
だから、ここは私の質問は以下のとおりです。
- 私は、最終的には、Symfony2のの本質と一般的には、{M} VCを取得しましたか?
- リファクタリングは優れていますか?そうでない場合は、より良い方法は何でしょうか?
ポストScriptum:私はユーザストアおよび認証のためのFOSUserBundleを使用できることを知っているが、これはどのようにsymfonyので動作するように自分自身を教えるための基本的な例です。 さらに、私のサービスにORM.Doctrine。*を注入しました(同じ混乱でこの質問を読んだ人の注釈)
:PARAMコンバータ上
詳細)? – redbirdo
ドメインビジネスロジックは、[モデルレイヤ](http://stackoverflow.com/a/5864000/727208)に入ります。 [ドメインオブジェクト]のモズレー(http://c2.com/cgi/wiki?DomainObject)。 –
@redbirdo:質問の目的には関係ありません。 – DonCallisto