如何在另一个捆绑包中扩展条令实体


How to extend doctrine entity in another bundle?

我有一个库捆绑包,它应该可以在其他项目中重复使用。在这个捆绑包中,我有以下实体:

My'GalleryBundle'Entity'Album
My'GalleryBundle'Entity'Photo
My'GalleryBundle'Entity'AlbumPhotoAssociation

AlbumPhoto都与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 }