Symfony2 - Актуализирайте обект, когато актуализирате друг обект

Този въпрос е по-скоро свързан с организацията на кода (следвайки указанията/стила на Symfony 2), отколкото със самия код.

Проблемът ми е лесен и често срещан: имам два свързани обекта, Account и Lines. В обекта 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, който изчислява общата сума и я задава в своето поле. В 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(){};

}
person Robin Dijkhof    schedule 13.07.2014