鉴于以下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"
)。我只想扩展。
答案 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。