2011-12-09 2 views
9

이전 버전의 Symfony에서는 확장 된 하위 클래스가있는 모델 클래스를 확장하여 데이터 객체 내에 새로운 객체를 만들 수있었습니다.Symfony 1에서 예전처럼 Symfony2에서 엔티티를 어떻게 확장합니까?

예를 들어 결과 표가있는 설문지 모델을 사용했습니다. 결과 테이블에는 Doctrine을 통해 결과를 설정하고 가져 오는 데 사용되는 Result.php 모델 클래스가 있습니다. 그런 다음 ResultPeer.php 모델 하위 클래스를 사용하여 결과를 가져온 Result 개체에 새 함수를 추가하고 고정 된 임계 값 집합에 따라 점수와 해당 색을 계산했습니다.

Doctrine2를 사용하는 새로운 Symfony2 버전에서는이 작업을 수행하는 가장 좋은 방법을 찾기 위해 고심하고 있습니다. 엔티티를 만들 때 문서에서 데이터 구조 관계에 따라 객체를 추가하는 기능 만 찾을 수 있습니다.

엔티티 리포지토리를 보았지만 원래 개체에 기능을 확장하거나 추가하지는 않습니다. 표준 쿼리 함수보다 복잡한 쿼리를 기반으로 데이터 개체를 다시 가져 오는 것 같습니다.

또한 객체를 수집하고 객체를 사용하여이 객체와 새로 생성 된 데이터가 포함 된 새로운 배열을 만드는 데 사용할 수있는 서비스를 살펴 보았습니다. 그러나 이것은 올바르게 보이지 않거나 Symfony의 철학을 따릅니다. 모든 것이 다.

기존 데이터 객체에 함수를 추가하는 방법을 아는 사람이 있습니까? 이전 버전의 Symfony에서 유용하다는 것을 알았지 만 새로운 버전의 Symfony2에서는 대안을 찾지 못했습니다.

답변

18

엔티티를 확장하는 것이 좋습니다. Doctrine2 세계에서는 상속 매핑에 대해 이야기합니다. 여기에 코드 예제가 있습니다. 그것은 BaseAuditableEntity을 생성하기 위해 확장되고 User 엔티티가 확장되어 BaseAuditableEntity으로 확장되는 BaseEntity을 정의합니다. 요령은 @Orm\MappedSuperclass 주석을 사용하는 것입니다. 이 상속 스키마는 내 관계 그래프에 세 개의 엔터티가 있더라도 단일 테이블을 만듭니다. 그러면 모든 속성을 단일 테이블로 병합합니다. 생성 된 테이블에는 관계를 통해 매핑 된 모든 속성, 즉 BaseAuditableEntity 및 User의 속성이 포함됩니다. 다음 코드 예제 : 여기

Acme\WebsiteBundle\Entity\BaseEntity.php

namespace Acme\WebsiteBundle\Entity; 

use Doctrine\ORM\Mapping as Orm; 

/** 
* @Orm\MappedSuperclass 
*/ 
class BaseEntity { 

} 

Acme\WebsiteBundle\Entity\BaseAuditableEntity.php

namespace Acme\WebsiteBundle\Entity; 

use Doctrine\ORM\Mapping as Orm; 

/** 
* @Orm\MappedSuperclass 
*/ 
class BaseAuditableEntity extends BaseEntity { 

    private $createdBy; 

    /** 
    * @Orm\Column(type="datetime", name="created_at") 
    */ 
    private $createdAt; 

    /** 
    * @Orm\ManyToOne(targetEntity="User") 
    * @Orm\JoinColumn(name="updated_by", referencedColumnName="id") 
    */ 
    private $updatedBy; 

    /** 
    * @Orm\Column(type="datetime", name="updated_at") 
    */ 
    private $updatedAt; 

    // Setters and getters here 
} 

Acme\WebsiteBundle\Entity\User.php

namespace Acme\WebsiteBundle\Entity; 

use Acme\WebsiteBundle\Entity\BaseAuditableEntity; 

use Doctrine\ORM\Mapping as Orm; 

/** 
* @Orm\Entity(repositoryClass="Acme\WebsiteBundle\Entity\Repository\UserRepository") 
* @Orm\Table(name="acme_user") 
*/ 
class User extends BaseAuditableEntity implements AdvancedUserInterface, \Serializable 
{ 
    /** 
    * @Orm\Id 
    * @Orm\Column(type="integer") 
    * @Orm\GeneratedValue 
    */ 
    private $id; 

    /** 
    * @Orm\Column(type="string", name="first_name") 
    */ 
    private $firstName; 

    /** 
    * @Orm\Column(type="string", name="last_name") 
    */ 
    private $lastName; 

    /** 
    * @Orm\Column(type="string", unique="true") 
    */ 
    private $email; 

    // Other properties 

    // Constructor 

    // Setters and getters 
} 

교리 2.1의 공식 상속 매핑 문서에 대한 링크 : here

희망이 있으면 도움이 되시길 바랍니다. 더 많은 정보가 필요하면 언제든지 주저하지 말고 의견을 남기십시오.

감사합니다,
매트 훌륭

+1

. 나는 그것이 가능 했음에 틀림 없다는 것을 알았다. Matt 감사합니다. –

+0

'BaseAuditableEntity.php'에 nullable = false를 가진'lastName' 컬럼이 있고 클래스를'User.php'로 확장한다고 가정 해 봅시다. 위의 coulumn lastname을 null 값 (nullable = true)을 허용하도록 변경해야합니다. 도와 주시겠습니까? 그렇게하는 법? –

+0

'User.php' 클래스에서'lastName' 속성과 그것에 연결된 주석을 다시 작성해보십시오.어쩌면 이것은 기본 엔티티에서 이전에 설정되었던 것을 대체 할 것입니다. 그것이 작동하지 않으면, 나는 더 이상 도울 수 없다는 두려움. doctrine2 메일 링리스트에서 질문 해보십시오. 해결책을 찾으면 주저하지 말고 여기에보고하십시오. – Matt

관련 문제