我正在使用带有Doctrine ORM的Silex,一切正常,但我遇到了一个我无法弄清楚的问题。
我在命名空间 Lpdq\Model\Entity 中有一个实体新闻,它在命名空间 Lpdq\Model 中扩展了另一个类新闻,其中包含一些方法和事前/事后教义方法。
我的实体新闻
<?php
namespace LpdqModelEntity;
/**
* News
*
* @Table(name="news")
* @Entity(repositoryClass="LpdqModelEntityRepositoryNews")
*/
class News extends LpdqModelNews{
/*some properties/methods*/
}
我的超级班级新闻
<?php
namespace LpdqModel;
/**
* 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 LpdqController;
use SilexApplication;
use SymfonyComponentHttpFoundationRequest;
use LpdqModelEntityNews;
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 回调才能启用生命周期回调。如果生命周期事件适用于从基类扩展的所有实体,则应将注释放入基类中,否则将其放在单个类中。
你LpdqModelEntityNews
扩展LpdqModelNews
这至少是令人困惑的。您也只显示部分实现 - 确保setTitle()
实际更新 Doctrine 的跟踪模型属性,以将实例标识为脏实例。否则,将不会调用刷新事件。