Symfony2 - So rufen Sie den Entity Manager einer Doctrine-Entität dynamisch ab

Wir bauen eine CMS- und Website-Plattform mit vielen verschiedenen Anbietern und Kunden-Websites auf. Es gibt also viele verschiedene Inhaltstyp-Entitäten, die von generischen Controllern und Hilfsdiensten bearbeitet werden, die nicht unbedingt (leicht) wissen, was Der Entitätsmanager ist für eine bestimmte Entität.

HINWEIS: Wir haben mehrere EntityManager, um den Zugriff auf verschiedene Datenbanken zu trennen, z. Global, Abrechnung, Lokal, etc

In vielen Fällen müssen wir den EntityManager der Entität ermitteln. Zum Beispiel haben wir einen MediaHelper, der Medien aus einer Datenbank dynamisch mit übereinstimmenden Feldern auf der Entität verknüpft (dies funktioniert nicht mit Verknüpfungen, da die Medien mit buchstäblich jeder Entität verbunden sein müssen und Sie diese Art von dynamischer Verknüpfung nicht haben können) Wir wollen nicht hundert verschiedene Assoziatione

Die Medien befinden sich in einem Bundle, das vom lokalen EntityManager verwaltet wird. Möglicherweise befindet sich die Entität jedoch in einem "globalen" EntityManager (Sie können nicht davon ausgehen, dass sie sich im selben Entitätsmanager befindet). Wir müssen also den richtigen Entitätsmanager für die richtige Entität erkennen und beibehalten.

Wie empfehlen Sie, den entityManager für eine Entität dynamisch zu ermitteln?

Original Custom Method

HINWEIS: Die akzeptierte Antwort ist eine viel bessere Lösung. Dies ist nur zu Archivierungszwecken hier.

Hier ist eine einfache Lösung, die funktioniert. Aber ich weiß nicht genug über Symfony und Doctrine, um zu wissen, ob es eine schlechte Idee ist? Weiß es noch jemand? Wenn nicht, weiß ich nicht, warum dies als Doctrine Utility nicht im Kern wäre.

Ich habe einen EntityHelper-Dienst erstellt, der den Doctrine-Dienst einfügt:

gutensite_cms.entity_helper:
    class: Gutensite\CmsBundle\Service\EntityHelper
    arguments:
        - "@doctrine"

Dann können Sie im Entity-Helper mit einer einfachen Funktion den Entity Manager für eine Entität abrufen (in der Datei config.yml werden die Bundles für Entitätsmanager bereits registriert):

/**
 * Automagically find the entityManager for an entity. 
 * @param $entity
 * @return mixed
 */
public function getManagerForEntity($entity) {
    $className = \Doctrine\Common\Util\ClassUtils::getRealClass(get_class($entity));
    foreach (array_keys($this->doctrine->getManagers()) as $name) {
        if(in_array($className, $this->doctrine->getManager($name)->getConfiguration()->getMetadataDriverImpl()->getAllClassNames())) return $em;
    }
}

HINWEIS:Doctrine Registry # getAliasNamespace macht bereits etwas fast Identisches mit dieser foreach-Schleife. Ich habe gerade die Idee geändert, den Entity-Manager anstelle des Namespaces zurückzugeben, z. B.

public function getAliasNamespace($alias) {
    foreach (array_keys($this->getManagers()) as $name) {
        try {
            return $this->getManager($name)->getConfiguration()->getEntityNamespace($alias);
        } catch (ORMException $e) {
        }
    }
    throw ORMException::unknownEntityNamespace($alias);
}

Update 21.10.15: Entitätserkennungscode gemäß @ Cerads Vorschlag aktualisiert.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage