Doctrine2 __constructor не вызывается при использовании $ em-> find ();?Как правильно загрузить объект? - PullRequest
10 голосов
/ 23 января 2011

Я изучаю doctrine2, и у меня возникла проблема с автоматическим вызовом конструктора. Например, в моей сущности у меня есть

/**
 * @Entity
 */
class User{
   ....
   public function __construct() {
       exit('in');
   }
}

и когда я получаю объект таким образом:

$userObj = $em->find('User', 1);

Я получаю этот объект из базы данных, но конструктор никогда не вызывается. Я хочу поместить некоторые общие вещи в конструктор, такие как правила проверки, или даже поместить пример кода из документации доктрины, такой как

        $this->comments = new ArrayCollection();

Этот курс работает, когда я создаю новый объект в коде для создания пользователя, такого как

$user = new User(); //now constructor works just fine

Теперь, каков "правильный" способ получения сущности? Я сомневаюсь, что мне приходится вызывать конструктор вручную каждый раз, когда я использую $ em-> find () с $ user0bj -> __ construct (); ? Тогда это было бы отстой ... Или я должен использовать что-то другое -> find (), чтобы получить единый объект правильно? Я знаю, что могу использовать @PrePersist, и я использую его для проверки правильности и т. Д. Я предполагаю, что я, вероятно, что-то здесь упускаю, или я пытаюсь использовать конструктор плохим способом. Спасибо за любые объяснения и руководства!

Ответы [ 3 ]

6 голосов
/ 24 января 2011

Я почти уверен, что find или аналогичный не вызовет конструктор ...

Вам нужно подключиться к событию @ PostLoad .

2 голосов
/ 26 января 2011

Почему вы хотите вызвать создателя уже существующей сущности? Когда вам нужно проверить его, вы должны были выполнить проверку или инициализацию, прежде чем сохранить его. Поэтому, когда вы вызываете уже существующую сущность, нет смысла проверять ее. Правильным местом для проверки и других инициализаций является метод конструктора объекта. Например.

/**
 * @Entity
 */
class User{
   protected $name;
   public function __construct($name) {
       if (isset($name)) {
           //** validate the name here */
           $this->name=$name;
       } else {
           throw new Exception("no user name set!");
       }
   }
}

В соответствии с документацией doctrine2 Doctrine2 никогда не вызывает метод __construct () для сущностей. http://www.doctrine -project.org / документы / ОРМ / 2,0 / о / ссылка / architecture.html? Изюминка = построить

0 голосов
/ 20 апреля 2019

Doctrine ORM "перезапишет" ваш класс, сгенерирует новый класс, который реализует \Doctrine\ORM\Proxy\Proxy

И переписает метод construct:

/**
     * @param \Closure $initializer
     * @param \Closure $cloner
     */
    public function __construct($initializer = null, $cloner = null)
    {

        $this->__initializer__ = $initializer;
        $this->__cloner__      = $cloner;
    }

Вы можете видетьвнутри папки cache ${CACHE}/doctrine/orm/Proxies.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...