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

时间:2016-03-28 15:01:25

标签: php symfony doctrine

鉴于以下Mapped Superclass已修复且无法更改:

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

    // ...
}

鉴于我的具体实体:

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

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

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

1 个答案:

答案 0 :(得分:1)

您可以为Load ClassMetadata Event订阅 EventSubscriber 以实现此目标。在Doctrine读取您的实体的元数据之后调用它,并且可以用它来改变它。

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);
    }
}

确保将此侦听器附加到Doctrine的EventManager,如in the Doctrine documentation所述。如果您使用的是Symfony 2/3,请改为使用Symfony documentation