10

を実行するdoctrine orm:validate-schemaと、マップされた列がパブリックであり、getter/setter メソッドを使用してそれらをラップしていないという警告が多数表示されます。「遅延読み込みを中断する」と書かれています。関連付けられたコレクションをパブリックにすることが問題になる可能性があることは理解できますが (私はこれらをプライベートにしてラップしています)、オブジェクトのフィールドではどのように問題になるのでしょうか? 私の知る限り、フィールドは完全にロードされています。

4

2 に答える 2

14

私は確かに Doctrine2 の専門家ではありませんが、これを試してみます。

私の (限られた) 使用法とテストから、Doctrine はそのオブジェクトのデータをロードせずに関連するオブジェクトを提供する可能性があるようです。その時点で、パブリック プロパティは遅延読み込みを中断します。

Doctrine は、永続化されたデータを含むオブジェクトが要求されたときではなく、永続化されたデータが要求された時点で遅延読み込みを行います。

更新:実際のプロキシ コードを調べたところ、最初の理解はほぼ正しかったようです。プロキシ オブジェクトは、オブジェクトのメソッドが呼び出されるまでロードされません。そのため、パブリック プロパティへのリクエストはデータをロードしません。

于 2010-11-03T19:04:50.297 に答える
9

Doctrine 2.4 は、パブリック プロパティを持つエンティティのプロキシ オブジェクトをサポートするようになったことに注意してください。

Marco Pivettaの Web サイトでは、その仕組みについて説明しています

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)
}
于 2013-09-17T08:48:22.277 に答える