2017-02-21 51 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直接使用查詢進行聚合!