我有一个库捆绑包,它应该可以在其他项目中重复使用。在这个捆绑包中,我有以下实体:
My'GalleryBundle'Entity'Album
My'GalleryBundle'Entity'Photo
My'GalleryBundle'Entity'AlbumPhotoAssociation
Album
和Photo
都与AlbumPhotoAssociation
有一对多关联,因为在相册和照片之间的这种多对多关系中,我需要一个order
列。
它们都有注释
@ORM'Entity
@ORM'Table
因此,该捆绑包的用户可以拥有开箱即用的默认表和关系。并且没有CCD_ 5,因为超类不能具有一对多关系。
================
现在我在我的项目中包括了这个捆绑包,我想覆盖(扩展)其中的一些实体,比如:
- 更改表名称
- 添加额外的列
- 定义特定于项目的常量,如
class Photo
中的const STATUS_VERIFIED_BY_ADMIN = 5;
我试着在我的捆绑包中扩展子类,但我得到了这个错误
类''"My''MainBundle''Entity''Album''"的子类''"My''GalleryBundle''Entity''Album''"不是有效的实体或映射超一流。
当我试图持久化我的子类或获取存储库时
$this->em->getRepository('MyMainBundle:Album');
// Or
$this->em->persist($album); // an instance of My'MainBundle'Album
我现在被卡住了,不知道该怎么做。或者我应该只在库束中定义一些特征,并在主束中定义事件实体类?
您可以使用映射的超类来完成此操作,并在EventListener中添加一对多关系。
<?php
namespace My'GalleryBundle'EventListener;
use Doctrine'ORM'Event'LoadClassMetadataEventArgs;
use Doctrine'ORM'Events;
use Doctrine'ORM'Mapping'ClassMetadataInfo;
class MappingListener
{
public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs)
{
$classMetadata = $eventArgs->getClassMetadata();
if ('My'GalleryBundle'Entity'Album' === $classMetadata->reflClass) {
$classMetadata->mapOneToMany(array(
'fieldName' => 'albumPhotoAssociation',
'targetEntity' => 'My'GalleryBundle'Entity'AlbumPhotoAssociation',
'mappedBy' => 'album',
'orphanRemoval' => true,
));
}
if ('My'GalleryBundle'Entity'Photo' === $classMetadata->reflClass) {
$classMetadata->mapOneToMany(array(
'fieldName' => 'albumPhotoAssociation',
'targetEntity' => 'My'GalleryBundle'Entity'AlbumPhotoAssociation',
'mappedBy' => 'photo',
'orphanRemoval' => true,
));
}
}
}
现在,您必须创建一个服务:
services:
acme_mapping_listener:
class: My'GalleryBundle'EventListener'MappingListener
tags:
- { name: doctrine.event_listener, event: loadClassMetadata }