2016-03-28 4 views
1

folgende Mapped Superclass gegeben, die festgelegt ist und nicht geändert werden kann: meine konkrete EinheitWie kann ich eine Doctrine-Spaltendefinition einer zugeordneten Superklasse erweitern, ohne die gesamte Definition zu überschreiben?

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

    // ... 
} 

Und da:

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

Wie kann mein ConcreteEntityerweitern die age Definition davon abgebildet geordnete Klasse ist und machen es nullable?

Ich weiß über die Attribute Override-Funktion, aber es würde erfordern, dass ich die gesamte Definition überschreiben (d. H. Wieder type = "integer" angeben). Ich möchte nur verlängern es aber.

Antwort

1

Sie können einen EventSubscriber an die Load ClassMetadata Event abonnieren, um dieses Ziel zu erreichen. Es wird aufgerufen, nachdem Doctrine die Metadaten Ihrer Entität gelesen hat und verwendet werden kann, um sie zu ändern.

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

Stellen Sie sicher, diese Zuhörer Lehre der Eventmanager zu befestigen, wie in the Doctrine documentation beschrieben. Wenn Sie Symfony 2/3 verwenden, folgen Sie stattdessen der Symfony documentation.

+0

Schön, dass Sie Ihre eigenen Fragen/Befunde hier beantworten und anderen dabei helfen. Mehr Leute sollten das tun. – nifr

Verwandte Themen