Doctrine2代理getId魔术方法?

时间:2012-08-13 18:48:23

标签: php doctrine-orm

Doctrine2 似乎为其延迟加载的Proxy对象添加魔法。它使我的结果不正确,我无法弄清楚是什么导致它。

这是我的班级模特:

类“RedProduct”继承自抽象类“Product”,它实现了接口“BaseProduct”

抽象类Product拥有主键:

abstract class Product implements BaseProduct {
   /** @Id @Column (type="integer", name="ID") @GeneratedValue */
    protected $id;

    public function getId() {    
        return $this->id;        
    }                            
}

我希望RedProduct在返回之前将字母'R'添加到id。

class RedProduct extends Product {
    public function getId() {
       return 'R' . $this->id;
    }
}

但是在代理类中,getId()方法(并且只有getId()方法)已被修改为:

public function getId()
{
    if ($this->__isInitialized__ === false) {
        return $this->_identifier["id"];
    }
    $this->__load();
    return parent::getId();
}

这意味着我的对象在未初始化时不会返回正确的ID!

“getId”是Doctrine2的保留或魔法吗?当我在基类和继承类中创建其他方法时,它对代理没有这种影响。

1 个答案:

答案 0 :(得分:-1)

如果检查代理上的getId()方法,您会看到它有这一行:

return parent::getId();

这意味着它将调用模型类(RedProduct)上定义的getId()函数,因为所有代理都扩展了相应的模型。问题出在其他地方。

我不确定你是通过修改模型返回的id来实现的,但Doctrine在持久化实体时不调用你的getter,它使用反射,所以如果问题是你的id不正确数据库,这可能是原因。