Silex + Doctrine ORM не запускает события при установке на @MappedSuperclass

Я использую Silex с Doctrine ORM, все работало правильно, но у меня возникла проблема, которую я не могу понять.

У меня есть Entity News в пространстве имен Lpdq \ Model \ Entity, который расширяет другой класс News в пространстве имен 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 не вызываются, когда я сохраняю свою сущность.
(Таким образом, я получаю ошибку, потому что мои свойства, созданные и обновленные, являются нулевыми)

Если я установлю свой объект News как HasLifecycleCallbacks и введу тот же метод prePersist / Update, они сработают.

Пока я здесь, мне интересно, является ли способ, которым я расширяю свои сущности для размещения до / после, и другие методы — хорошая или плохая практика?

3

Решение

Если у вас есть несколько сущностей, которые нуждаются в одном и том же наборе методов, то иметь новости базового класса имеет смысл, если только одна сущность расширяет новости класса, тогда это является излишним, и вы можете поместить код в сам класс сущностей.

Общий шаблон таков: если у вас есть несколько сущностей и все для них создали и обновили поле, тогда вы должны создать базовый класс, и все такие сущности должны его расширить.

Вы должны иметь аннотацию HasLifecycleCallbacks для включения обратных вызовов жизненного цикла. Если события жизненного цикла применимы ко всем сущностям, которые вы расширяете из базового класса, то вы должны поместить аннотацию в базовый класс, в противном случае — в отдельные классы.

0

Другие решения

У тебя есть Lpdq\Model\Entity\News простирающийся Lpdq\Model\News что по крайней мере сбивает с толку.
Вы также показываете только частичную реализацию — убедитесь, что setTitle() фактически обновляет отслеживаемые свойства модели для Doctrine, чтобы идентифицировать экземпляр как грязный. В противном случае события сброса не будут вызваны.

0

По вопросам рекламы [email protected]