给定以下映射超类,该超类是固定的,不能更改:
/** @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文档。