2016-03-28 101 views
1

鑑於以下Mapped Superclass這是固定的,不能更改:如何在不覆蓋整個定義的情況下擴展映射超類的Doctrine列定義?

/** @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

您可以訂閱EventSubscriberLoad ClassMetadata Event來實現此目標。它在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

+0

很高興你在這裏回答你自己的問題/發現,從而幫助他人。更多的人應該這樣做。 – nifr

相關問題