2014-12-05 3 views
3

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

У меня есть Новости сущности в пространстве имен Lpdq \ Model \ Entity, который расширяет другой класс Новости в пространстве имен Lpdq \ Model, который содержит некоторые методы и методы pre/post event для доктрины.

Мой лица Новости

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

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

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

ответ

0

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

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

Необходимо включить аннотацию HasLifecycleCallbacks, чтобы активировать обратные вызовы Lifecycle. Если события жизненного цикла применимы для всех объектов, которые вы распространяете из базового класса, тогда вы должны поместить аннотацию в базовый класс, иначе поместите его в отдельные классы.

0

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

Смежные вопросы