2014-03-07 2 views
0

나는 전에 symfony/doctrine을 사용해 본 적이 없으며이 일을 올바르게하려고 노력 중입니다. 나는 ProjectBundleFeatureBundle을 만들었습니다.symfony와 doctrine 구성을 oneToMany와 함께 구성하기

난에 다음과 같은 인터페이스와 클래스를 내 ProjectBundleEntity 디렉토리 : 나는 완전히 별개의 문제는 ProjectBundle 아무튼을 시도하고 있습니다 때문에

내 응용 프로그램에서
Project.php (implements ProjectInterface) 
ProjectInterface.php 
ProjectItemInterface.php 

하는 Project 많은 Features을 가질 수 있지만, FeatureBundle에 대해 알 필요가 없습니다. 많은 다른 구현을 가지고 있기 때문에 나는 ProjectItemInterface을 구현하지 않았습니다.

모든 번들을 함께 가져 오는 내 앱에 대해 CoreBundle을 사용할 계획입니다. 나는 Sylius과 같은 우려를 분리하려고 시도하고 있습니다.

각 번들에서 doctrine 구성을 어떻게해야하는지에 당황 스럽습니다. 여기에 내가 ProjectBundle

Acme\Bundle\ProjectBundle\Entity\Project: 
    type: mappedSuperclass 
    id: 
     id: 
      type: integer 
      generator: 
       strategy: AUTO 
    fields: 
     name: 
      type: string 
      length: 255 
     createdAt: 
      type: datetime 
      gedmo: 
       timestampable: 
        on: create 
     updatedAt: 
      type: datetime 
      gedmo: 
       timestampable: 
        on: update 
      nullable: true 
    oneToMany: 
     items: 
      targetEntity: Acme\Bundle\ProjectBundle\Entity\ProjectItemInterface 
      mappedBy: project 
      orphan-removal: true 
      cascade: 
       - all 

Project.orm.yml에 대해 가지고있는 ProjectItemInterface 다형성 때문에 그래도 난 혼란 스러워요 것입니다. 내 응용 프로그램의 경우에는 Feature이어야하지만, 나중에 Task과 같은 다른 엔티티 유형을 추가해야 할 수도 있습니다.

ProjectInterface에는 일반 ::addItem(ProjectItemInterface $item)::getItems() 정의가 정의되어 있습니다.

이러한 방법은 ProjectBundle에는 적합하지만 CoreBundle에는 적합하지 않습니다. 내가 ::addFeature(FeatureInterface $task)::addTask(TaskInterface $task) 같은 메소드를 원한다고 생각됩니다. 이것은 혼란의 하나의 영역입니다.

다른 하나는 CoreBundle에서 Project.orm.yml 파일이 어떻게 보일 것인가입니다. 그 이유는이베이스 Project 엔티티를 확장하고 앱에 특정 속성과 메소드를 추가하기 때문입니다.

것은 난 내가 기본 Project을 확장 할 때 내가 사용하게 될 생각 mapped superclasses에 읽었하지만 난 CoreBundle에서 oneToManyProjectItemInterface 관계를 구성하는 방법을 모르겠어요. 저는 discriminator map에 대해 조금 읽었습니다. 그러나 나는 서로를 확장하는 클래스들에 대해서 생각합니다. 내 ProjectItemInterface 구현은 기본을 확장하지 않습니다 ProjectItem. 요약하자면

:

  1. 내 번들/엔티티 구조는 의미가 있습니까?
  2. ProjectBundle이 너무 일반적이며 내 프로젝트의 내용을 내 CoreBundle에 포함시켜야하며 완료해야합니까?
  3. 그렇지 않은 경우 내 에 내 ProjectItemInterface 구현에 대해 다형성 oneToMany 교리 관계를 구성하려면 어떻게해야합니까?

    /CoreBundle 
     /Entity 
      Project.php (extends ProjectBundle's Project) 
      ProjectInterface.php (extends ProjectBundle's ProjectInterface) 
      Feature.php (extends FeatureBundle's Feature) 
      FeatureInterface.php (extends FeatureBundle's FeatureInterface and ProjectBundle's ProjectItemInterface) 
     /Resources 
      /config 
       /doctrine 
        Project.orm.yml (don't know what this should look like) 
        Feature.orm.yml 

    /ProjectBundle 
     /Entity 
      Project.php 
      ProjectInterface.php 
      ProjectItemInterface.php 
     /Resources 
      /config 
       /doctrine 
        Project.orm.yml 

    /FeatureBundle 
     /Entity 
      Feature.php 
      FeatureInterface.php 
     /Resources 
      /config 
       /doctrine 
        Feature.orm.yml 

답변

0

이것은 매우 중요한 질문입니다. 나는 단지 몇 가지 사항을 언급 할 것입니다.

확실히 당신은 물건을 분리하는 것에 대해 꽤 많이 알고 있습니다. S2/D2에 익숙하지 않다는 사실은 내가 일하는 방식에 익숙해 질 때까지 Project와 Feature 번들을 결합하여 시작하는 것이 좋습니다. 제 관심은 단지 시작하기에 너무 많은 노력을 기울일 수 있다는 것입니다.

이렇게 말하면, 여기를 통해 읽으십시오 : http://symfony.com/doc/current/cookbook/doctrine/resolve_target_entity.html.

D2를 사용하면 CoreBundle에서 정의 할 수있는 인터페이스를 통해 프로젝트 엔티티를 Feature 엔티티에 연결할 수 있습니다. 그런 다음 런타임에 실제 Feature 클래스를 지정할 수 있습니다. 따라서 프로젝트가 어디에서 오는지 알 필요가 없습니다. 그것은 몇 가지 한계가 있지만 귀하의 목적에 충분할 수 있습니다.

두 번째 방법은 D2 관계를 완전히 피하는 것입니다. 대신 프로젝트 엔티티가로드 될 때 기능을 요청하는 이벤트를 전달합니다. 핵심 이벤트 리스너는 이벤트를 선택하여 쿼리를 발생시키고 기능을 반환합니다. 이 방법은 두 번들을 완전히 분리하지만 물론 업데이트 등을 수행하는 것을 어렵게 만들 수 있습니다.

바라건대, 이것은 적어도 시도 할 방향에 대한 힌트를 제공합니다.

+0

답장을 보내 주셔서 감사합니다. 그래, 불행히도 시작할 때 별거에 집중하지 않으셔도됩니다. 나는 심포니 책에서 그 장을 보지 못했습니다. 흥미롭고 내가 필요할 수도 있습니다. 그래도이 장에는 오류가 있다고 생각합니다. 고객 엔티티 주석에서 "이 예제에서는 InvoiceSubjectInterface에 정의 된 메소드가 BaseCustomer에 이미 구현되어 있습니다". 나는 그 진술이 잘못되었다고 생각한다. BaseCustomer는'CustomerBundle'에서 인보이스 관련 메소드를 사용하지 않아야합니다. – David

+0

Nope. 예제에서 고객은 InvoiceSubject이므로 InvoiceSubject 메소드를 구현해야합니다. 송장은 완전히 다른 오브젝트입니다. – Cerad

+0

오른쪽이지만 InvoidSubjectInterface 메서드는 CustomerBundle의 BaseCustomer에 구현되지 않았으므로 InvoiceBundle에서 CustomerBundle을 분리하려는 경우 CoreBundle의 기본 고객을 확장하는 고객 클래스에 구현됩니다. – David

관련 문제