2

私のアプリケーションには、Customers と Couriers があります。顧客は、宅配業者が現在オンラインで、両方のユーザーが同じ場所にいる場合にのみ、宅配業者に配達依頼を送信できます。

顧客が宅配便業者に配送リクエストを送信したい場合、私のDeliveryRequestサービスにはsendDeliveryRequest(Request request)から呼び出されるメソッドがありControllerます。

public function sendDeliveryRequest(Request $request) {

    $customer = $this->recognitionService->getUser();

    $courier = $this->entityFactory->build('Courier');
    $courier->setId( $request->post('courierId') );
    $courierMapper = $this->mapperFactory->build('Courier');
    $courierMapper->fetch($courier);

    $deliveryRequest = $this->entityFactory->build('DeliveryRequest');

    $someRequestedItems = array();
    $deliveryRequest->sendRequest($customer, $courier, $someRequestedItems);

}

これまでのところ、私のsendRequest(Customer $customer, Courier $courier, Array $items)方法では次のとおりです。

public function sendRequest(Customer $customer, Courier $courier, Array $items) {

    // Check if the couriers account is active
    if( !$courier->isActive() ) {
        return 'courier not active';
    }
    // Check if the courier is online
    if( !$courier->isOnline() ) {
        return 'courier not online';
    }
    // Check the status of the customers location, active/inactive
    if( !$customer->getLocation()->isActive() ) {
        return 'customers location disabled';
    }
    // Check if the customer and the courier live in the same location
    if( !$customer->sameLocationAs($courier) ) {
        return 'customer and courier in different locations';
    }
    // More checks

}

これまでのところ、問題なく動作しているように見えますが、ビジネス ロジック、特に!$customer->sameLocationAs($courier).

このメソッドは、提供された$courierオブジェクトを使用して Couriers の場所 ( を持つオブジェクトid) を取得し、それを Customers の場所と比較して、同じ場所にあるかどうかを確認します。それは完全に機能しますが、両方のユーザーが同じ場所にいるかどうかを確認するための最良の方法であるかどうかはわかりません. それは有効なビジネス ロジックですか?

また、 のアイテム$deliveryRequest、そのデータ ( idquantity) は$requestから渡されたオブジェクトに含まれるため、 でControllerそれぞれを作成Itemし、それらを配列に入れて、andを使用Serviceして配列をメソッドに渡します。つまり、そのメソッド内でチェック(入力された数量が数量のデータベース値を超えていないかどうかなどを確認する)を行う必要があることを意味しますが、それは正しい方法ですか、それとも悪いですか?$customer$couriersendRequest()

チェック/検証を正しく、アプリケーションの正しい場所/レイヤーで行っていますか?

どんな助けでも大歓迎です。

4

1 に答える 1

0

最初の質問については、あなたのメソッド「sameLocationAs」は有効だと思います。もう 1 つの可能性は、静的メソッドを持ち、クラス間でサービスを提供できる Util クラスを作成することでした。

これは、アイテムが有効かどうか (コントローラーではない) をチェックするモデルの仕事なので、次の 2 つの可能性があります。

  1. あなたがしたいように

  2. Item オブジェクトを作成すると、アイテム クラスまたはオブザーバー デザイン パターンを使用して、オブジェクトの有効性を確認できます。(難しく、その必要はありません。オブジェクトを自動的に保存したい場合は興味深い)

  3. 仕事をする検証クラスを使用します(それもいいでしょう)

サービスコードがサービスの関心のみに関係する場合は良いでしょう。

しかし、あなたがしたことは私が言う正しいことであり、有効です。あなたはもう少し先に進むべきです

于 2013-03-28T17:28:31.817 に答える