我将 Silex 与 Doctrine ORM 一起使用,一切正常,但我遇到了一个我无法解决的问题。
我在命名空间 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...*/
}
在我的 Controller 中,我只是实例化我的实体并持久化/刷新它
<?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 方法没有被调用。 (所以我得到一个错误,因为我创建和更新的属性是空的)
如果我将我的实体 News 设置为 HasLifecycleCallbacks 并放置相同的 prePersist/Update 方法,它们将被触发。
虽然我在这里,但我想知道我扩展我的实体以放置前/后和其他方法的方式是好的还是坏的做法?
最佳答案
如果您有多个需要同一组方法的实体,那么拥有一个基类 news 是有意义的,如果只有一个实体扩展 news 类,那就太过分了,您可以将代码放在您的实体类本身中。
一般模式是,如果您有多个实体,并且所有实体都为它们创建和更新了字段,那么您应该创建一个基类,所有这些实体都应该扩展它。
您需要具有注释 HasLifecycleCallbacks 才能启用生命周期回调。如果生命周期事件适用于您从基类扩展的所有实体,那么您应该将注释放在基类中,否则将其放在单独的类中。
关于php - Silex + Doctrine ORM 在@MappedSuperclass 上设置时不会触发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27307821/