2017-02-21 4 views
0

私は頻繁にSymfonyでデザイン問題を経験していますが、私が最適に解決しているかどうかはわかりません。エンティティのモデル計算ロジックSymfonyで頻繁に発生する問題

は私が例を挙げてみましょう:マーチャントアカウントの名前

Entity Merchant Account 
property $dailyProcessingLimitation // Int 
property $orders // ArrayCollection 

エンティティは、X、ユーロのに設定し、日々の処理制限があります。

私は次の操作を実行し、特定の商人のアカウントは、その処理の限界に達している場合は、これを行うには、チェックしたい:私は今日のためにすべての注文を取得し、単一通貨にそれらすべてを変換し、これを行うには

私はエンティティにコンテナを注入するべきではないので、私はエンティティの内部でこれを行うことはできませんので、私は通貨コンバータのようなものが必要です。

ので、私は「MerchantAccountManager」を作成する必要があり、このような何か:

$merchantAccountManager = $this->container->get('merchant_account_manager'); 
$totalForAccount = $this->getTotalProcessedForMerchantAccount($merchantAccount); 

は、のように感じている、これを追加することではなく、その後、エンティティにこれを直接呼び出すことができるようにする任意の適切な方法はあります醜いコーディング。

なぜ私はそれが悪いデザインのように感じるのですか、他の開発者はエンティティメソッドを検査するのではなく、サービスが存在することを知る必要があるということです。

答えて

2

MerchantAccountの上限に達した場合はどうなりますか?新しい注文を受け取ることはできませんか?この場合、MerchantAccountメソッドに配置して使用します。

public function addOrder(Order $newOrder) 
{ 
    if (($order->getAmount() + $this->getOrdersAmount()) <= $this->dailyProcessingLimitation) { 
     throw new Exception('The limit has been reached'); 
    } else { 
     $this->orders->add($order); 
    } 

    return $this; 
} 

public function getOrdersAmount() 
{ 
    $result = 0; 
    foreach ($this->orders as $order) { 
     $result += $order->getAmount(); 
    } 

    return $result; 
} 
0

あなたは、単にすべての注文を取得し、日々の加工限界を突破されているかどうかを特定の条件に基づいて計算するエンティティを使用することができます。

<?php 
namespace AppBundle\Entity 

class MerchantAccount { 
... 
public function getTotalForAccount() 
{ 
    $sum = 0; 

    foreach($this->getMerchant()->getOrders() as $order) 
    { 
     if(//WHATEVER CONDITIONS YOU NEED) { 
      $sum += $order->getAmount(); 
     } 
    } 

    return $sum; 
} 
... 

は見ている:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/cookbook/aggregate-fields.html

をそれとも、ただ書くことができます直接クエリを使用して集計するDQL!

関連する問題