2014-12-05 108 views
3

我使用Silex与Doctrine ORM,一切工作正常,但我遇到了一个我无法弄清楚的问题。Silex + Doctrine ORM不会在@MappedSuperclass上设置时触发事件

我在命名空间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方法不会被调用。 (所以我得到一个错误,因为创建和更新我的属性为null)

如果我把我的实体作为新闻和HasLifecycleCallbacks放在同一prePersist /更新方法,它们被触发。

虽然我在这里,我想知道如果我扩展我的实体的方式,把前/后和其他方法是好的或不好的做法?

回答

0

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

一般模式是,如果你有多个实体,并且他们都已经创建并更新了字段,那么你应该创建一个基类,所有这些实体都应该扩展它。

您需要注释HasLifecycleCallbacks才能启用生命周期回调。如果生命周期事件适用于从基类继承的所有实体,那么您应该在基类中放入注释,否则将其放入单独的类中。

0

您有Lpdq\Model\Entity\News延伸Lpdq\Model\News这至少是令人困惑的。 您也仅显示部分实施 - 确保setTitle()实际上更新了用于Doctrine的跟踪模型属性以将实例标识为脏。否则,不会调用刷新事件。