Symfony2 - 更新另一个实体时更新实体

时间:2014-07-13 21:24:26

标签: php symfony doctrine-orm triggers code-organization

这个问题与代码组织(遵循Symfony 2指南/样式)有关,而不是代码本身。

我的问题很简单和常见:我有两个相关的实体,即帐户和行。在Account实体中,我有一个名为CurrentTotal的字段,在Lines实体中有一个名为Amount的字段。

当我持久或更新任何Lines实体,添加或减去Amount数量时,我需要更新Account.CurrentTotal字段。

我知道我可以将这个业务逻辑添加到控制器中,但这样做我将控制器与实体非常相似,我认为这不是放置业务逻辑的好地方。

我还可以创建一个Doctrine监听器,当我更新或持久化Line类型的实体时,更新相关的Account实体。但如果我有一百个实体,而我需要五六十个这样的"触发器",也许这将是一团糟......

我的问题是:建立这种"触发器"的正确/推荐方法是什么?使用Symfony 2?请记住,我需要使用PHPUnit来测试它,所以它必须是松散耦合的。

1 个答案:

答案 0 :(得分:0)

假设您使用了学说并且在帐户和行之间存在关系并且已经映射了这种关系。如果还没有,请查看this

我会向Account添加一个名为countTotal()的方法,该方法计算将其设置为其字段的总数。在Lines中必须有一个方法setAmounts或我会调用countTotal()

的东西

简单的代码示例:

class Account(){
    private $total;
    protected arrayCollection $lines;//your lines

    //some basic methods
    public function getLines(){};
    public function setLines(lines){};
    public function addLine(line){};
    public function getTotal(){};

    public function countTotal(){
        $total = 0;
        foreach(line in $this->lines){
            total += lines;
        }
        $this->total = total;
    }
}

class Line(){
    private $amount
    protected $account

    public function setAmount(amount){
        $this->amount = amount;
        $this->account->countTotal();
    }

    public function getAmount(){};

}