Symfony2 でビジネスロジックを配置する場所はどこですか? 質問する

Symfony2 でビジネスロジックを配置する場所はどこですか? 質問する

多くの投稿やStack Overflowのリソースを読んだ後でも、「ビジネスロジックをどこに置くべきか?」という有名な質問についてまだ疑問が残っています。StackOverflow の質問そしてブログ投稿、コード分離の問題をよく理解できたと思います。

データベースに追加されるユーザーを追加できる Web フォームがあるとします。この例には次の概念が含まれます。

  • 形状
  • コントローラ
  • 実在物
  • サービス
  • リポジトリ

何かを見落としていなければ、エンティティをデータベースに永続化するには、いくつかのプロパティ、ゲッター、セッターなどを使用してエンティティを作成する必要があります。そのエンティティを取得または書き込む場合は、 および を使用します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));
    }

「New-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#1 コード部分から #2 コード部分までの見えないすべてのコードが保存されるカスタム サービスはどこにありますか。

そこで、私の質問は次のとおりです。

  1. ようやく、symfony2 と {M}VC の本質を理解できたでしょうか?
  2. リファクタリングは適切ですか? そうでない場合、より良い方法は何でしょうか?

追記: ユーザーストアと認証に FOSUserBundle を使用できることはわかっていますが、これは Symfony の操作方法を自分で学ぶための基本的な例です。さらに、私のサービスは動作するために ORM.Doctrine.* で注入されました (同じ混乱を抱えてこの質問を読んでいる人のためのメモです)

ベストアンサー1

ビジネス ロジックを配置する場所については、SOA アーキテクチャとドメイン駆動アーキテクチャという 2 つの主なアプローチがあります。ビジネス オブジェクト (エンティティ) が貧弱な場合、つまりビジネス ロジックがなく、ゲッターとセッターだけの場合は、SOA が適しています。ただし、ビジネス オブジェクト内にビジネス ロジックを構築する場合は、他のアプローチが適しています。Adam Bien は、これらのアプローチについて次のように説明しています。

Java EE 6 によるドメイン駆動設計:http://www.javaworld.com/javaworld/jw-05-2009/jw-05-ドメイン駆動設計.html

Java EE 6 を使用したリーン サービス アーキテクチャ:http://www.javaworld.com/javaworld/jw-04-2009/jw-04-lean-soa-with-javaee6.html

Java ですが、概要は理解できます。

おすすめ記事