1

私は Zend 1.11 と Doctrine 1.2 との統合に取り組んでおり、Service Layers の使用について多くのことを読んでいます。

私の理解では、サービス レイヤーはビジネス ロジックの上にあり、コントローラーとドメイン モデルの間にレイヤーを追加します。

しかし、サービス層を実際に実装する方法に行き詰まっています。これは主に、サービス クラスにどのタイプの API を定義する必要があるのか​​ 少しわからないためです。

App_Service_Membershipsまず、ビジネス エンティティ グループApp_Model_Groupとユーザーを次のように処理するサービス クラスが与えられますApp_Model_User

サービス クラスの API は、前述のドメイン モデルのインスタンスを受け入れるか返すことによって、クラスの構成を公開する必要がありますか?

それとも、サービス クラスの API は、整数や配列などのネイティブ データ型のみを受け入れたり返したりして、クラスの構成を隠す必要がありますか?

言うように:

class App_Service_Memberships
{

    public function addUserToGroup($user_id, $group_id)
    {

        //Create or retrieve domain models here and operate on them; handle persistence.
        $membership = new App_Model_Membership();

        $membership->member->user_id = $user_id;
        $membership->group->group_id = $group_id;
        $membership->join_date = date("Y-m-d H:i:s");

        $membership->save();

        return $membership->toArray();
    }

    public function getMembersOfGroup($group_id)
    {
         $groupMembers = array();

         //Query objects here with Doctrine or the ORM of choice...

         foreach($results as $membership){
             $groupMembers[] = $membership->member->toArray();
         }

         return $groupMembers;
    }
}

コントローラーがパラメーター (フォームからのデータ、または他のサービス クラスからの出力) として整数をサービス クラスに渡すだけで、関連するドメイン モデルがまったくわからない場合。

とは対照的に:

class App_Service_Memberships
{
    public function addUserToGroup(App_Model_UserInterface $user, App_Model_Group $group)
    {
        //Create or retrieve domain models here and operate on them; handle persistence.
        $membership = new App_Model_Membership();

        $membership->member = $user;
        $membership->group = $group;
        $membership->join_date = date("Y-m-d H:i:s");

        $membership->save();

        return $membership;
    }

    public function getMembersOfGroup(App_Model_Group $group)
    {
         $groupMembers = array();

         //Query memberships here

         foreach($results as $membership){
             $groupMembers[] = $membership->member;
         }

         return $groupMembers;
    }
}

コントローラーがそのスコープ内のドメイン モデルを処理し、それらをサービス クラスに渡す場所はどこですか?

どちらがより良い習慣だと思いますか?

4

1 に答える 1

1

...サービス クラスの API は、整数や配列などのネイティブ データ型を受け入れるか返すだけで、クラスの構成を隠す必要がありますか?

はい、これが理想です。サービスのクライアント (この場合はコントローラー) に事前に構築されたドメイン エンティティ (ユーザー) を渡すように強制すると、クライアントはドメインについて多くのことを知るようになります。すべきではありません。

サービス メソッドは静的にすることもできます (ただし、静的である必要はありません)。

サービス クラスのプレフィックスは実際には 必要ありません。App_これが ZF コミュニティでいつ開始されたのかは定かではありませんが、カーゴ カルト化されて死んでおり、実際には必要ありません。私は通常、サービス (およびアプリケーション固有のすべて) を の下に置きますlib。より具体的に言うと、 which はとsrc/main/libでうまく機能します。src/test/*src/vendor/lib

戻り値については...私は通常、サービスメソッドが何らかのコレクションを返すようにしています。配列は問題ありません。ただし、多くの場合、より豊富なコレクション オブジェクトが非常に役立ちます (必須ではありません)。時々、Zend Paginator オブジェクトを使用して実用的にすることもあります。これは利用可能な最も豊富なコレクション オブジェクトではありませんが、OOTB で動作します。

于 2012-04-05T20:56:32.623 に答える