2011-01-19 71 views
4

想象一下,我有一个名为“item”的表格,其中有一个名为“price”的列。除了全价,我想获得的价格跨越12个月传播,即将派生字段添加到Doctrine_Record子类的最佳方式是什么?

class Item extends Doctrine_Record { 
    ... 
    public function getMonthlyPrice() { 
    return $this->price/12; 
    } 
} 

现在,说我想有项目的行为就像每月价格只是另一列,而不是函数调用,例如,

$m = Doctrine_Core::getTable("Item")->find(1); 
echo $m->price; //prints 120 
echo $m->monthlyPrice; //prints 10 

我的第一个直觉是重写__get()方法。在教义中有没有更好或更标准的方法来做到这一点?


奖金的问题:

有一些非常聪明的办法,我可以钻机的对象,所以当我做

var_dump($m->getData()) 

我看到

array 
    'price' => 120 
    'monthlyPrice' => 10 

会很漂亮FTY。

回答

0

正如布赖恩说,你可以使用滤镜做到这一点,但还有另一种方式,我认为是更接近你在找什么 - 你” d需要启用Doctrine的ATTR_AUTO_ACCESSOR_OVERRIDE功能,这意味着它将检查形式为get *和set *的方法,它们与你的属性自动调用它们相匹配。这里有一个例子:

class Example extends Doctrine_Record { 

    public function getFoo() { 
     return 'foo'; 
    } 
} 

Doctrine_Manager::getInstance()->setAttribute(Doctrine_Core::ATTR_AUTO_ACCESSOR_OVERRIDE, true); 

$example = new Example(); 
echo $example->foo; 

至于你的问题,不是我见过的第二部分 - 你最好的选择是要覆盖的方法在你的模型适当,或创建Doctrine_Record的子类,你的模型然后扩展它有一个覆盖该功能的覆盖。

相关问题