Symfony中的频繁设计问题,实体中的模型计算逻辑

时间:2017-02-21 20:30:58

标签: entity-framework doctrine symfony

我经常在Symfony遇到设计问题,我不确定我是否能以最佳方式解决它。

让我举个例子:

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

名为Merchant帐户的实体具有每日处理限制,设置为X欧元

我想检查特定商家帐户是否已达到其处理限制,为此,请执行以下操作:

我获取今天的所有订单,并将它们全部转换为单一货币,为此,我需要一些东西,如货币转换器,所以我不能在实体内部这样做,因为我不应该注入容器进入实体。

所以我必须创建一个" MerchantAccountManager",然后执行以下操作:

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

是否有任何正确的方法可以直接在实体上调用它,而不是添加感觉像丑陋的编码。

为什么我觉得感觉设计不好的原因是,其他开发人员必须知道服务存在,而不是能够检查实体方法。

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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进行聚合!