2016-10-03 3 views
2

Ich habe eine Entität, die benutzerdefinierte Hydrationslogik erfordert. Ich versuche, einen benutzerdefinierten Doctrine2-Hydrator für diese Entität zu erstellen. Das Projekt wird mit Symfony3 geschrieben, so schrieb ich eine einfache:Doctrine2 benutzerdefinierte Hydrator für einzelne Einheit

final class CustomHydrator extends AbstractHydrator 
{ 
    protected function hydrateAllData() 
    { 
     return array_map(function(array $data) { 
      // I'm doing that custom logic here 
      $computedData = /* ... */ 
      return new EntityClass($computedData); 
     }, $this->_stmt->fetchAll(\PDO::FETCH_ASSOC)); 
    } 
} 

Das Hydrator in config.yml registriert wurde:

orm: 
    entity_managers: 
    default: 
     hydrators: [CustomHydrator] 

Leider ist es nicht überall genannt wird und ich nicht alle Unterlagen zu finden, die erklären würde, der Prozess des Einhängens von Hydratatoren in Doctrine.

Die Frage ist: Wie erstellt man benutzerdefinierte Lehre Hydrator, so dass eine einzelne Entität oder eine Teilmenge der abgebildeten Entitäten auf diese Weise automatisch hydratisiert werden würde?

Antwort

0

Versuchen Sie, die folgende Konfiguration in Ihrer config.yml:

orm: 
    entity_managers: 
     default: 
      hydrators: 
       CustomHydrator: \Your\Namespace\To\CustomHydrator 

Dann in Ihrem Repository (oder wo auch immer Sie Ihre Einheiten sind das Abrufen), sollten Sie Ihre eigenen Abfragen machen und Ihre Hydrator im getResult Methode verwenden :

$query->getResult('CustomHydrator'); 

Darüber hinaus hat eine Frage bereits gestellt, wie Lehre Standard Hydrator ändern, wenn Sie Ihren Hydrator müssen bei jeder Abfrage aufgerufen werden: How to set the default hydrator in Doctrine?

+0

Danke, aber ich versuche einen Weg zu finden, Doctrine zu zwingen, diese Entity * automatisch * zu hydratisieren, ohne den Namen des Hydrators zu erwähnen. Es gibt ein Projekt mit Dutzenden von Entitäten und es ist einfach nicht möglich, jeden 'find *' Aufruf zu finden. –

+0

Dann sollte der Standard-Hydrator, wie in der Link erklärt, den Trick (nie selbst ausprobiert, aber wenn es der Standard-Hydrator ist, denke ich sogar finden * Methoden werden es verwenden) – Boulzy

+0

So ist es nicht möglich, einen Hydrator für erstellen die Entität direkt? Muss ich meinen eigenen globalen Hydrator für den gesamten 'EntityManager' erstellen? –

2

Vielleicht könnten Sie einen zweiten EntityManager erstellen, den Standard-Hydrator dort festlegen und diese Entitäten damit verarbeiten?

orm: 
    entity_managers: 
    default: 
     ... 
    myCustom: 
     ... 
+1

Natürlich könnte ich, aber das geht gegen das, was ich versuche zu erreichen. Die ultimative Antwort ist, dass es in Doctrine nicht so gemacht werden kann, wie ich es möchte. –

Verwandte Themen