Ответ 1
Я почти уверен, что find
или подобное не должны вызывать конструктор...
Вам нужно подключиться к событию @PostLoad.
Я изучаю 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, и я использую его для проверки валидации и т.д. Я предполагаю, что я, вероятно, что-то пропустил, или я пытаюсь использовать конструктор в плохом ключе. Спасибо за любые объяснения и руководства!
Я почти уверен, что find
или подобное не должны вызывать конструктор...
Вам нужно подключиться к событию @PostLoad.
Почему вы хотите вызвать 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
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
.