对doctrine2代理对象的反思

时间:2013-02-11 12:40:50

标签: php reflection symfony doctrine-orm

据我所知,像property_exists()这样的反射方法不适用于doctrine2代理对象。

在这种情况下,通过关系$user->getCity()

检索代理

如何在这种情况下检查属性是否存在?

2 个答案:

答案 0 :(得分:2)

您可能想要先检查代理是否已初始化:

if (
    $entity instanceof \Doctrine\Common\Persistence\Proxy
    && ! $entity->__isInitialized()
) {
    $proxy->__load();
}

这基本上强制加载代理:之后,所有内容都会像原始实体的实例一样工作。

ORM目前不支持公共属性,但该功能将在Doctrine ORM 2.4中实现。这样,您就可以访问公共属性,而无需担心对象是否是代理。

答案 1 :(得分:2)

解决方案是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);