据我所知,像这样的反射方法property_exists()
不适用于学说 2 代理对象。
在这种情况下,代理是通过关系检索的$user->getCity()
在这种情况下,如何检查属性是否存在/是否设置?
据我所知,像这样的反射方法property_exists()
不适用于学说 2 代理对象。
在这种情况下,代理是通过关系检索的$user->getCity()
在这种情况下,如何检查属性是否存在/是否设置?
解决办法是ReflectionClass::getParentClass()
。
所以这样的代码应该可以工作:
$reflect = new \ReflectionClass($proxyObject);
if ($proxyObject instanceof \Doctrine\Common\Persistence\Proxy)
// This gets the real object, the one that the Proxy extends
$reflect = $reflect->getParentClass();
$privateProperty = $reflect->getProperty('privateProperty');
$privateProperty->setAccessible(true);
$privateProperty->setValue($proxyObject, $yourNewValue);
您可能需要检查代理是否首先初始化:
if (
$entity instanceof \Doctrine\Common\Persistence\Proxy
&& ! $entity->__isInitialized()
) {
$proxy->__load();
}
这基本上强制加载代理:之后,一切都会像您拥有原始实体的实例一样工作。
顺便说一下,ORM 目前不支持公共属性,尽管该功能将在 Doctrine ORM 2.4 中实现。这样,您将能够访问公共属性,而不必担心对象是否是代理。