7

ユーザーをデータベースに保存できるようにしたいと考えてください。追加アクションは次のとおりです。

    public function addAction()
    {

    $form = new UserForm();
    $form->get('submit')->setValue('Add');

    $request = $this->getRequest();

    if ($request->isPost()) {

        $userFilter = new UserFilter();
        $form->setInputFilter( $userFilter->getInputFilter() );
        $form->setData( $request->getPost() );

        if ($form->isValid())

            $user = new User();
            $user->setEmail($form->getInputFilter()->getValue('email')  );
            $user->setNome( $form->getInputFilter()->getValue('name') );


            $em = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
            $em->persist($user);
            $em->flush();


            return $this->redirect()->toRoute('user');

        }
    }

    return array('form' => $form);
    }

ユーザーをデータベースに保存するのは非常に簡単ですが、複雑なビジネス ロジックを追加する必要がある場合は、電子メールが一意であるかどうかを確認し、Web サービスにアクセスして、人生の究極の問題に対する答えを確認したいと考えています。 、ユニバース、およびすべてが実際には42であり、trueの場合、ユーザーをデータベースに保存したい場合は、ユーザーにメッセージを表示したい.

アクションを追加することはできますが、これはあまり良い習慣ではないと言われているので、このビジネスロジックをエンティティ User 内に配置できますが、これにより zf2 と教義とエンティティとの間の結合が追加され、これも悪いことです。Web でソリューションを検索すると、ビジネス ロジックをサービス レイヤーに配置することが答えのようです。

Service Layer ソリューションに従って、クラス UserBusinessLogic を作成し、すべてが問題なければビジネス ロジックを実行してユーザーを保存するメソッド save を作成します。

これは正しいと思いますか?この件に関するドキュメントはありますか?おそらく、doctrine 2 と zf2 およびサービスを使用してビジネス ロジックを処理する方法を示すコード例です。

結論としては、zf2 と doctrine 2 を使用する場合、ビジネス ロジックを配置するベスト プラクティスは何ですか?

サービスソリューションが最善の方法であると仮定します。エンティティ ユーザー、グループ、およびこれら 2 つの間の関係がある場合、「アクセス」と呼ばれるサービスを作成します。このサービスは、コントローラーからデータを受信して​​ユーザーをグループに保存し、それら 2 つをリンクし、次のような他のタスクを実行するサービスになります。ユーザーパスワードをリセットするためのメールを送信します。これは正しいと思いますか?

4

1 に答える 1

1

あなたは正しい考えを持っています。Doctrine 2 をさらに切り離すには、Zend\Db のインターフェイスの 1 つをたどる別のレイヤーを作成できますが、Doctrine を使用してデータベースの相互作用を実現します。

また、検証のために、Doctrine を使用してデータベースに対してチェックするフォーム用のカスタム入力フィルターを作成できます。

メソッド名が同じままである限り、サービスの背後にあるものは何でもサービスを変更することで置き換えることができるという考えです。このようにして、たとえば後で Doctrine を Propel に置き換えることができ、コントローラーとビューをリファクタリングする必要はなく、サービス クラスだけをリファクタリングする必要があります。

于 2013-06-09T18:56:33.740 に答える