symfony2 query generate entitymanagerinterface consultas symfony doctrine2 entitymanager

query - symfony 3 database config



Symfony2-Cómo obtener dinámicamente un Entity Manager de una entidad de Doctrine (2)

¿No puedes darle al administrador de la entidad un alias que se adapte al contexto para el que está? Habla de Global, Facturación, Local, por ejemplo:

''service_manager'' => array( ''aliases'' => array( ''global_entity_manager'' => ''My/Global/EntityManager'', ''billing_entity_manager'' => ''My/Billing/EntityManager'', ''local_entity_manager'' => ''My/Local/EntityManager'', ), )

También puede asignar el administrador de la entidad al espacio de nombre de la entidad. Entonces digamos que tiene una carpeta para sus entidades globales que es Global/Entity , entonces podría alias el administrador de entidades para esas entidades Global/Entity/EntityManager . La ventaja de esta solución es que puede asignar varios espacios de nombres al mismo administrador de entidades, por lo que sus entidades Billing y Global pueden compartir fácilmente el mismo administrador de entidades:

''service_manager'' => array( ''aliases'' => array( ''Global/Entity/EntityManager'' => ''My/Global/EntityManager'', ''Billing/Entity/EntityManager'' => ''My/Global/EntityManager'', // <-same name ''Local/Entity/EntityManager'' => ''My/Local/EntityManager'', ), )

Esto solo funciona si sus entidades en un espacio de nombre son administradas por la misma instancia de EntityManager . Apenas puedo creer que este no sea el caso en ningún proyecto, pero de lo contrario quizás debería reorganizarse un poco? :RE

Estamos construyendo una plataforma de creación de CMS y sitios web con muchos sitios de vendedores y clientes diferentes, por lo que hay muchas entidades de tipo de contenido diferentes, que son editadas por controladores genéricos y servicios de ayuda que no necesariamente (fácilmente) saben qué el administrador de la entidad es para una entidad dada.

NOTA: Tenemos varias entidades administradoras para separar el acceso a diferentes bases de datos, por ejemplo, global, facturación, local, etc.

Hay muchos casos en los que necesitamos detectar cuál es el EntityManager de la entidad. Por ejemplo, tenemos un MediaHelper que asocia dinámicamente los medios de una base de datos con campos coincidentes en la entidad (esto no funciona con asociaciones porque los medios tienen que conectarse literalmente con cualquier entidad y no se puede tener ese tipo de asociación dinámica y no queremos cientos de asociaciones diferentes).

Los medios están en un paquete administrado por el EntityManager ''Local''. Pero la entidad puede estar en un EntityManager ''Global'' (no puede asumir que está en el mismo administrador de entidad). Entonces, necesitamos detectar y persistir al administrador de entidad correcto para la entidad correcta.

Entonces, ¿cómo recomienda la detección dinámica de entityManager para una entidad?

Método personalizado original

NOTA: la respuesta aceptada es una solución mucho mejor. Esto es solo aquí para fines de archivo.

Aquí hay una solución simple que funciona. Pero no sé lo suficiente sobre Symfony y Doctrine para saber si es una mala idea. ¿Alguien más sabe? Si no, no sé por qué esto no estaría en el centro, como una utilidad de Doctrine.

Creé un servicio EntityHelper que inyecta el servicio Doctrine en él:

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

Luego, en la entidad auxiliar, hay una función simple para obtener el Administrador de Entidades para una entidad (el config.yml ya registra los paquetes para los administradores de entidades):

/** * 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; } }

NOTA: Doctrine Registry # getAliasNamespace ya hace algo casi idéntico a este bucle foreach, simplemente modifiqué la idea de devolver el administrador de entidades en lugar del espacio de nombres, por ejemplo

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

Actualización 10/21/15: Código de detección de entidad actualizado por sugerencia de @Cerad.


Según la sugerencia de @qooplmao, ya hay un método fácil en el núcleo de Doctrine.

// 1) get the real class for the entity with the Doctrine Utility. $class = /Doctrine/Common/Util/ClassUtils::getRealClass(get_class($entity)) // 2) get the manager for that class. $entityManager = $this->container->get(''doctrine'')->getManagerForClass($class);

Actualizado 22/10/15 Después de sugerencias de Cerad y Qooplmao