Silex + Doctrine ORM 在设置@MappedSuperclass时不会触发事件


Silex + Doctrine ORM doesn't fire events when set on @MappedSuperclass

我正在使用带有Doctrine ORM的Silex,一切正常,但我遇到了一个我无法弄清楚的问题。

我在命名空间 Lpdq''Model''Entity 中有一个实体新闻,它在命名空间 Lpdq''Model 中扩展了另一个类新闻,其中包含一些方法和事前/事后教义方法。

我的实体新闻

<?php
namespace Lpdq'Model'Entity;
/**
 * News
 * 
 * @Table(name="news")
 * @Entity(repositoryClass="Lpdq'Model'Entity'Repository'News")
*/
class News extends Lpdq'Model'News{
 /*some properties/methods*/
}

我的超级班级新闻

<?php
namespace Lpdq'Model;
/**
 * News
 * 
 * @MappedSuperclass
 * @HasLifecycleCallbacks
*/
class News{
   /**
    * @PrePersist
    */
    public function prePersist()
    {
        $this->setCreated(new 'DateTime());
        $this->setUpdated(new 'DateTime());
    }
    /**
     * @PreUpdate
     */
    public function preUpdate()
    {
        $this->setUpdated(new 'DateTime());
    }
    /*...some methods...*/
}

在我的控制器中,我只是实例化我的实体并保留/刷新它

<?php
namespace Lpdq'Controller;
use Silex'Application;
use Symfony'Component'HttpFoundation'Request;
use Lpdq'Model'Entity'News;
class NewsController {
    public function addAction( Request $request, Application $app) {
        $news = new News();
        $news->setTitle('test');
        /*...*/
        $app['orm.em']->persist($news);
        $app['orm.em']->flush();
        /*...*/
    }
}
我的

问题是当我持久化我的实体时,没有调用我的prePersist/preUpdate方法。(所以我收到一个错误,因为我创建和更新的属性为空)

如果我将我的实体新闻设置为HasLifecycle Callbacks并放置相同的prePersist/Update方法,它们将被触发。

当我在这里时,我想知道我扩展实体以放置前/后和其他方法的方式是好的做法还是坏做法?

如果您有多个需要相同方法集的实体,那么拥有一个基类新闻是有意义的,如果只有一个实体正在扩展类新闻,那么这是矫枉过正的,您可以将代码放在实体类本身中。

一般模式是,如果您有多个实体,并且所有实体

都已创建并更新了字段,则应创建一个基类,并且所有此类实体都应对其进行扩展。

您需要具有注释 HasLifecycle 回调才能启用生命周期回调。如果生命周期事件适用于从基类扩展的所有实体,则应将注释放入基类中,否则将其放在单个类中。

Lpdq'Model'Entity'News扩展Lpdq'Model'News这至少是令人困惑的。您也只显示部分实现 - 确保setTitle()实际更新 Doctrine 的跟踪模型属性,以将实例标识为脏实例。否则,将不会调用刷新事件。