3

私が見る限り、property_exists()doctrine2 プロキシ オブジェクトでは動作しないようなリフレクション メソッドがあります。

この場合、プロキシはリレーションシップを通じて取得されます$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 に答える