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

Я изучаю 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

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

Ответ 1

Я почти уверен, что find или подобное не должны вызывать конструктор...

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

Ответ 2

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

/**
 * @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/docs/orm/2.0/en/reference/architecture.html?highlight=construct

Ответ 3

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.