2014-12-05 4 views
3

Doctrine ORM에서 Silex를 사용하고 있지만 모든 것이 제대로 작동하고 있지만 알아낼 수없는 문제가 있습니다.Silex + Doctrine ORM은 @MappedSuperclass를 설정할 때 이벤트를 발생시키지 않습니다.

나는 doctrine을위한 몇 가지 메소드와 이벤트 전/후 메소드가 포함 된 Lpdq \ Model 네임 스페이스의 다른 클래스 News를 확장하는 네임 스페이스 Lpdq \ Model \ Entity에 엔티티 뉴스를 가지고있다.

내 기업 뉴스

<?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 메서드가 호출되지 않습니다. (생성 및 업데이트 된 속성이 null이므로 오류가 발생합니다)

실체 News를 HasLifecycleCallbacks로 설정하고 동일한 prePersist/Update 메서드를 설정하면 해당 prePersist/Update 메서드가 트리거됩니다.

내가 여기있는 동안 사전/게시물을 넣는 엔티티를 확장하는 방법과 다른 방법이 좋든 좋지 않은지 궁금하다.

답변

0

동일한 메소드 세트를 필요로하는 엔티티가 여러 개있는 경우 기본 클래스 뉴스를 갖는 것이 중요합니다. 하나의 엔티티 만 클래스 뉴스를 확장하면 과도한 것이므로 엔티티 클래스 자체에 코드를 넣을 수 있습니다.

일반적인 패턴은 여러 엔티티가 있고 모두 필드를 만들고 업데이트 한 경우 기본 클래스를 만들어야하며 모든 엔티티가이를 확장해야합니다.

Lifecycle 콜백을 사용하려면 HasLifecycleCallbacks 주석이 있어야합니다. 라이프 사이클 이벤트가 기본 클래스에서 확장하는 모든 엔티티에 적용 가능한 경우 기본 클래스의 주석에 넣고 그렇지 않으면 개별 클래스에 넣어야합니다.

0

Lpdq\Model\Entity\News 길이가 Lpdq\Model\News 인 것은 적어도 혼란 스럽습니다. 부분 구현 만 표시하고 있으므로 setTitle()이 실제로 Doctrine의 모델 속성을 추적하여 해당 인스턴스를 더티로 식별해야합니다. 그렇지 않으면 flush 이벤트가 호출되지 않습니다.