Comment peut-domaines publics « briser le chargement paresseux » dans Doctrine 2?

StackOverflow https://stackoverflow.com/questions/4090609

  •  28-09-2019
  •  | 
  •  

Question

Quand je lance doctrine orm:validate-schema, il apparaît un tas d'avertissements sur mes colonnes mappées être public et ne pas utiliser les méthodes de lecture / setter pour les envelopper. Il dit qu'ils « briser le chargement paresseux ». Je peux comprendre comment prendre des collections associées public pourrait être problématique (je ne fais ces privés et les envelopper), mais comment est-ce un problème pour les champs de l'objet? Les champs sont chargés en totalité, à ma connaissance.

Était-ce utile?

La solution

Je vais donner un coup de feu à ce même si je ne suis certainement pas un expert Doctrine2.

De mon utilisation et de test (limité), il semble doctrine peut vous donner un objet associé sans charger les données pour cet objet . À ce moment-là propriétés publiques briser le chargement paresseux.

La doctrine est chargement différé au niveau du point où les données ont persisté est demandé, pas lorsque l'objet qui contient des données persisté est demandée.

Mise à jour: Je pris un coup d'oeil à la le code proxy réel et il semble ma compréhension originale était la plupart du temps correct. L'objet proxy ne se charge pas jusqu'à ce que est appelé une méthode de l'objet. Ainsi, toute demande d'une propriété publique ne chargeait pas les données.

Autres conseils

Notez que Doctrine 2.4 maintenant supports proxy objets pour ENTITES avec les propriétés publiques .

Site de

Marco Pivetta », explique comment cela fonctionne :

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)
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top