如何在不覆盖整个定义的情况下扩展映射超类的Doctrine列定义


How can I extend a Doctrine column definition of a mapped superclass without overriding the whole definition?

给定以下映射超类,该超类是固定的,不能更改:

/** @ORM'MappedSuperclass() */
abstract class AbstractEntity
{
    /** @ORM'Column(type="integer", nullable=false) */
    protected $age;
    // ...
}

考虑到我的具体实体:

/** @ORM'Entity */
class ConcreteEntity extends AbstractEntity { // ... }

我的ConcreteEntity如何扩展其映射超类的age定义并使其可为null?

我知道"属性覆盖"功能,但它需要覆盖整个定义(即再次指定type = "integer")。不过,我只想扩展

您可以将EventSubscriber订阅到Load ClassMetadata事件以实现此目标。它是在条令读取实体的元数据后调用的,可以用来更改它

use Doctrine'Common'EventSubscriber;
use Doctrine'ORM'Event'LoadClassMetadataEventArgs;
use Doctrine'ORM'Events;
use Doctrine'ORM'Mapping'ClassMetadata;
class YourSubscriber implements EventSubscriber {
    public function getSubscribedEvents() {
        return [Events::loadClassMetadata];
    }
    public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs) {
        /** @var ClassMetadata $metadata */
        $metadata = $eventArgs->getClassMetadata();
        if ($metadata->getName() != 'F'Q'N'ConcreteEntity') {
            return;
        }
        // Get field mapping of the age field.
        $fieldMapping = $metaData->fieldMappings['age'];
        $fieldMapping['nullable'] = true;
        $metadata->setAttributeOverride($fieldName, $fieldMapping);
    }
}

确保将此监听器连接到条令的EventManager,如条令文档中所述。如果您使用的是Symfony 2/3,请参阅Symfony文档。