3

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

在这种情况下,代理是通过关系检索的$user->getCity()

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

4

2 回答 2

7

解决办法是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);
于 2016-11-08T15:46:57.553 回答
2

您可能需要检查代理是否首先初始化:

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

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

顺便说一下,ORM 目前不支持公共属性,尽管该功能将在 Doctrine ORM 2.4 中实现。这样,您将能够访问公共属性,而不必担心对象是否是代理。

于 2013-02-14T01:35:09.173 回答