나는 전에 symfony/doctrine을 사용해 본 적이 없으며이 일을 올바르게하려고 노력 중입니다. 나는 ProjectBundle
과 FeatureBundle
을 만들었습니다.symfony와 doctrine 구성을 oneToMany와 함께 구성하기
난에 다음과 같은 인터페이스와 클래스를 내 ProjectBundle
의 Entity
디렉토리 : 나는 완전히 별개의 문제는 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
에서 oneToMany
ProjectItemInterface
관계를 구성하는 방법을 모르겠어요. 저는 discriminator map에 대해 조금 읽었습니다. 그러나 나는 서로를 확장하는 클래스들에 대해서 생각합니다. 내 ProjectItemInterface
구현은 기본을 확장하지 않습니다 ProjectItem
. 요약하자면
:
이- 내 번들/엔티티 구조는 의미가 있습니까?
- 내
ProjectBundle
이 너무 일반적이며 내 프로젝트의 내용을 내CoreBundle
에 포함시켜야하며 완료해야합니까? - 그렇지 않은 경우 내 에 내
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
답장을 보내 주셔서 감사합니다. 그래, 불행히도 시작할 때 별거에 집중하지 않으셔도됩니다. 나는 심포니 책에서 그 장을 보지 못했습니다. 흥미롭고 내가 필요할 수도 있습니다. 그래도이 장에는 오류가 있다고 생각합니다. 고객 엔티티 주석에서 "이 예제에서는 InvoiceSubjectInterface에 정의 된 메소드가 BaseCustomer에 이미 구현되어 있습니다". 나는 그 진술이 잘못되었다고 생각한다. BaseCustomer는'CustomerBundle'에서 인보이스 관련 메소드를 사용하지 않아야합니다. – David
Nope. 예제에서 고객은 InvoiceSubject이므로 InvoiceSubject 메소드를 구현해야합니다. 송장은 완전히 다른 오브젝트입니다. – Cerad
오른쪽이지만 InvoidSubjectInterface 메서드는 CustomerBundle의 BaseCustomer에 구현되지 않았으므로 InvoiceBundle에서 CustomerBundle을 분리하려는 경우 CoreBundle의 기본 고객을 확장하는 고객 클래스에 구현됩니다. – David