在Doctrine 2中,公共领域如何"打破延迟加载"?

rye*_*guy 10 php doctrine-orm

当我运行时doctrine orm:validate-schema,会弹出一堆关于我的映射列是公共的警告,而不是使用getter/setter方法来包装它们.它说他们"打破懒惰装载".我可以理解如何使公共关联集合成为问题(我确实将它们设为私有并将它们包装起来),但这对于对象上的字段来说又是怎样的问题?据我所知,字段已全部加载.

Tim*_*tle 14

虽然我当然不是Doctrine2专家,但我会对此给出一个镜头.

根据我的(有限的)使用和测试,似乎Doctrine可能会给你一个相关的对象而不加载该对象的数据.那时公共属性将打破延迟加载.

Doctrine是在请求持久化数据时延迟加载,而不是在请求包含持久数据的对象时.

更新:我看了一下实际的代理代码,看来我原来的理解大多是正确的.在调用对象的方法之前,代理对象不会加载自身.因此,对公共财产的任何请求都不会加载数据.

  • Geez,这很烦人.谢谢你的研究. (2认同)

Ben*_*min 9

请注意,Doctrine 2.4现在支持具有公共属性的entites的代理对象.

Marco Pivetta的网站解释了它的工作原理:

class Customer {
    public $name;
    public $surname;
}

class CustomerProxy extends Customer {
    public function __construct(Customer $customer) {
        unset($this->name, $this->surname);
        $this->customer = $customer;
    }
    public function __set($name, $value) {
        $this->customer->$name = $value;
    }

    public function __get($name) {
        return $this->customer->$name;
    }
    // __isset, __unset, __clone, __sleep, __wakeup (or serialize/unserialize)
}
Run Code Online (Sandbox Code Playgroud)