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

标签 php symfony doctrine-orm silex mappedsuperclass

我将 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/

相关文章:

security - Symfony2 中的 scrypt 支持

symfony - 在管理类(不是 Controller 类)中使用 getParameter()

php - Doctrine 2 添加自动生成序列值的新字段

php - 如何使用原则和 symfony 读取 DC2Type 数组

php - mod_rewrite 重写规则?

php - PHP代码评论YouTube视频

validation - Symfony 自定义验证约束传递参数

php - Doctrine2 更新导致 Zend Framework 3 中 AnnotationRegistry registerLoader 错误

php - 多选复选框显示表记录

php - 如何避免在 Laravel 模型创建事件中创建记录