Php Doctrine2代理getId魔术方法?
Doctrine2似乎在为其代理对象添加延迟加载的魔力。这使得我的结果不正确,我无法找出原因 这是我的班级模型: 类“RedProduct”继承自抽象类“Product”,后者实现接口“BaseProduct” 抽象类产品拥有主键:Php Doctrine2代理getId魔术方法?,php,doctrine-orm,Php,Doctrine Orm,Doctrine2似乎在为其代理对象添加延迟加载的魔力。这使得我的结果不正确,我无法找出原因 这是我的班级模型: 类“RedProduct”继承自抽象类“Product”,后者实现接口“BaseProduct” 抽象类产品拥有主键: abstract class Product implements BaseProduct { /** @Id @Column (type="integer", name="ID") @GeneratedValue */ protected $id;
abstract class Product implements BaseProduct {
/** @Id @Column (type="integer", name="ID") @GeneratedValue */
protected $id;
public function getId() {
return $this->id;
}
}
我希望RedProduct在返回id之前在id前面加上字母“R”
class RedProduct extends Product {
public function getId() {
return 'R' . $this->id;
}
}
但是在proxy类中,getId()方法(并且只有getId()方法)被修改为:
public function getId()
{
if ($this->__isInitialized__ === false) {
return $this->_identifier["id"];
}
$this->__load();
return parent::getId();
}
这意味着我的对象在未初始化时不会返回正确的id!
“getId”是Doctrine2的保留方法还是神奇方法?当我在基类和继承类中创建其他方法时,它对代理没有这种影响。如果在代理上检查getId()方法,您将看到它有以下行:
return parent::getId();
这意味着它将调用在模型类(RedProduct)上定义的getId()函数,因为所有代理都扩展了相应的模型。问题出在别处
我不确定您试图通过修改模型返回的id来实现什么,但Doctrine在持久化实体时不调用getter,它使用反射,因此如果问题是您的id在数据库中不正确,这可能就是原因。感谢您的响应。你是对的,除了对象没有初始化之外,这种情况下RedProduct对象是一个延迟加载的关联引用,比如说ProductReview对象。从代理方法中,如果对象没有初始化,它只返回主键。我的问题仍然是——getId()是否有特殊的案例行为?我应该补充一点,如果我调用$review->getProduct()->getName();首先,然后调用$review->getProduct()->getId();,这是正确的,因为getName()强制产品对象“load()”不,据我所知,getId()不是保留方法或类似的东西。知道为什么它是唯一一个获得“if not initialized,return id”子句的方法吗?其他方法都不是这样的。一定有什么神奇的事情发生了,不是吗?