Symfony2 — обновить объект при обновлении другого объекта

Этот вопрос больше связан с организацией кода (в соответствии с рекомендациями/стилем Symfony 2), чем с самим кодом.

Моя проблема проста и распространена: у меня есть два связанных объекта: «Учетная запись» и «Линии». В объекте Account у меня есть одно поле с именем CurrentTotal, а в объекте Lines — поле с именем Amount.

Что мне нужно, так это обновить поле Account.CurrentTotal, когда я сохраняю или обновляю любой объект Lines, добавляя или вычитая количество Amount.

Я знаю, что могу добавить эту бизнес-логику в контроллер, но при этом я сильно связываю контроллер с сущностями, и я думаю, что это не лучшее место для размещения бизнес-логики.

Я также могу создать прослушиватель Doctrine, и когда я обновляю или сохраняю объект типа Line, обновляю связанный объект Account. Но если у меня будет сотня сущностей, а мне нужно пятьдесят-шестьдесят этих "триггеров", может, это будет бардак...

И мой вопрос: Какой правильный/рекомендуемый способ создания такого рода «триггеров» с Symfony 2? Имейте в виду, что мне нужно, чтобы это можно было протестировать с помощью PHPUnit, поэтому он должен быть свободным. в паре.


person marc casas    schedule 13.07.2014    source источник


Ответы (1)


Предполагая, что вы используете доктрину и имеете связь между учетной записью и линиями и сопоставили эту связь. Если нет, посмотрите это.

Я бы добавил метод countTotal() в Account, который вычисляет общее количество en устанавливает его в свое поле. В строках должен быть метод 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(){};

}
person Robin Dijkhof    schedule 13.07.2014