使用$ em-> find()时未调用Doctrine2 __constructor; ?如何正确加载实体?

Dal*_*bor 10 doctrine-orm

我正在学习doctrine2,并且遇到了如何自动调用构造函数的问题.例如,在我的实体中,我有

/**
 * @Entity
 */
class User{
   ....
   public function __construct() {
       exit('in');
   }
}
Run Code Online (Sandbox Code Playgroud)

当我以这种方式获得对象时:

$userObj = $em->find('User', 1);
Run Code Online (Sandbox Code Playgroud)

我从数据库中获取该对象,但从不调用构造函数.我想在构造函数中放置一些常见的东西,比如验证规则,甚至可以从教条文档中放入示例代码

        $this->comments = new ArrayCollection();
Run Code Online (Sandbox Code Playgroud)

当我在代码中创建用于创建用户的新对象时,这个过程就有效

$user = new User(); //now constructor works just fine
Run Code Online (Sandbox Code Playgroud)

现在,获得实体的"正确"方式是什么?我怀疑每次使用$ user-bj - > __ construct()用户$ em-> find()时我都必须手动调用构造函数; ?这有点糟糕...或者我应该使用其他东西 - > find()来正确获得单个实体?我知道我可以使用@PrePersist,我正在使用它来实际进行验证检查等.我想我可能在这里遗漏了一些东西,或者我试图以糟糕的方式使用构造函数.感谢您的任何解释和指导!

Cob*_*bby 6

我很确定find或者类似的不会被称为构造函数...

你需要挂钩@PostLoad事件.

  • 这是非常糟糕的风格,你会得到意想不到的行为.你不需要再次设置Arraycollection,当调用$ em-> find()时,Doctrine会为你做这件事.如果需要在实体上执行初始化逻辑,则应使用@PostLoad事件. (2认同)