getProperties()根据发送到doctrine find的$ id返回不同的属性($ id)

时间:2014-10-10 13:56:43

标签: symfony doctrine-orm

我的代码是:

$record = $em->getRepository('AcmeDemoBundle:Venues')->find($id); 
$reflect = new \ReflectionClass($record);
$props = $reflect->getProperties();

$ props是一个包含24个ReflectionProperty对象的数组,与Venues类的24个属性相关。这是预期的行为。

当我执行相同的代码和$ id = 2时出现问题,虽然$ reflect对象似乎是相同的,现在$ props数组只包含3个奇怪的ReflectionProperty,其名称为_entityPersister,_identifier和 isInitialized

我更改了桌面上ID为2的记录上的所有值,以便镜像其他正常工作。它没有帮助。

我认为我错过了一些重要的东西,但我不知道它到底是什么。请帮忙;)

PD: 我包括以下重要代码: 树枝阵列扩展:

public function arrayFilter($entity) {
    $fieldnames = $this->container->getFieldnames($entity);
    if (is_object($entity)) {
        $response = (array) $entity;
        $i = 0;
        foreach ($response as $k => $v) {

            unset($response[$k]);
                $new_key = $fieldnames[$i];
                $response[$new_key] = $v;
            $i++;
        }
        return $response;
    }
    return null;
}

使用此功能:

  public function getFieldnames($record) {

        $reflect = new \ReflectionClass($record);
        $props = $reflect->getProperties();
        $fieldnames = Array();
        foreach ($props as $prop) {
            $fieldnames[] = $prop->getName();
        }
        return $fieldnames;
    }

1 个答案:

答案 0 :(得分:1)

您正在对Doctrine Proxy类进行反思。 Doctrine在内部使用代理,以提供热切的水合作用和其他功能。在对您正在使用的实体进行基本使用时,这是透明的,但如果使用反射或转储变量,您将看到各种代理属性和方法。

我的建议是,不要在代理上使用反射,但如果你真的需要,请告诉学说急切地获取你的实体。这样做会阻止代理机制生效并污染您的实体。