3

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

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

我的实体新闻

<?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 方法没有被调用。 (所以我收到一个错误,因为我创建和更新的属性为空)

如果我将我的实体 News 设置为 HasLifecycleCallbacks 并放置相同的 prePersist/Update 方法,它们就会被触发。

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

4

2 回答 2

0

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

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

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

于 2014-12-12T14:03:22.013 回答
0

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

于 2015-01-22T14:17:24.887 回答