2011-02-10 13 views
11

Voy a usar entity_manager en mi modelo. Pero entity_manager solo está disponible en el controlador: throw $em = $this->get('doctrine.orm.entity_manager'). Entonces, tengo que definir los métodos del modelo con el parámetro $em. Esto está haciendo que las pruebas de phpUnit sean bastante difíciles y viola la estructura de la aplicación. Por ejemplo:Symfony2 entityManager en el modelo

class Settings 
{ 
    public static function getParam($em, $key) 
    { 
     $em->createQuery(" 
      SELECT s 
      FROM FrontendBundle:Settings s 
      WHERE s.param = {$key} 
     "); 
     return $em->getResult(); 
    } 
} 

¿Existe algún método para utilizar el servicio entity_manager en la sección de modelo?

Respuesta

8

consultas en la clase de entidad

Poner consultas en ti entidad parece extraño para mí. Del mismo modo que realizar consultas en su clase de modelo en Doctrine 1 no se considera una buena práctica. Las clases de entidad deben ser livianas.

Estoy aprendiendo Doctrine2 y estaba pensando en un problema similar: ¿dónde enviar consultas?

En Doctrina 1 hay clases especiales de mesa y me esperaba algo similar en Doctrina 2.

patrón Repositorio

Hoy he aprendido que la Doctrina 2 está utilizando el patrón Repositorio: http://www.doctrine-project.org/docs/orm/2.0/en/reference/working-with-objects.html#custom-repositories

Sin embargo, para recuperar una instancia de la clase del repositorio, necesita utilizar Entity Manager. De una forma u otra lo necesitas.

Aún así, seguir el patrón de repositorio parece ser una mejor opción.

En mi opinión Si insistes en tener un método de consulta en tu clase de entidad, tienes que pasarle un administrador de entidad.

Prueba

Por qué la necesidad de pasar gestor de la entidad hace que sea difícil de probar? Según mi experiencia, las dependencias explícitas facilitan las pruebas ya que puedes controlarlas en la prueba (y burlarlas, por ejemplo).

Por otro lado, pasar el administrador de entidades a cada método tampoco es una elección correcta. En tal caso, haría la dependencia obligatoria y la agregaría al contructor.

14

En primer lugar, una nota inicial: por convención, su clase Entity debería ser singular. Entonces, Configuración, no Configuración. Se podría argumentar que la "configuración" como un grupo de configuraciones relacionadas podría verse como una sola entidad. Aún así, algo a tener en cuenta.

En Doctrine2, utilizaría un repositorio para realizar este tipo de consulta. En su código donde iba a llamar al Settings::getParam, en su lugar buscaría el repositorio y lo consultaría. En Symfony2, dicen:

// $em is your entitymanager, as you were going to pass to your method above 
// $key is the key you were going to pass to your method above 
$repository = $em->getRepository('\FrontendBundle\Settings'); 
$setting = $repository->getByParam($key); 

Por defecto, sin necesidad de escribir código, repositorios definen getByXXXX para cada campo en su entidad.

Si tiene una consulta más complicada que hacer, puede ampliar el repositorio.

use Doctrine\ORM\EntityRepository; 

class SettingsRepository extends EntityRepository 
{ 
    public function getBySomeComplicatedQuery() { 
     $sort_order = $this->getEntityManager() 
      ->createQuery('SELECT count(s) FROM FrontendBundle\Settings s WHERE s.value > 32') 
      ->getResult(Query::HYDRATE_SINGLE_SCALAR); 
    } 

} 

Y entonces llamarías a ese método de la misma manera.

Otros recomendarían el uso de un objeto Manager que no estaría vinculado a la Entidad/ORM, pero creo que es una complicación innecesaria.

Doctrine2 está específicamente diseñado para no permitirle usar consultas en su archivo Entity; Las entidades y los gestores de entidades son en realidad dos aspectos de la capa de modelo estándar, separados para aplicar las mejores prácticas. Ver este artículo: http://symfony2basics.jkw.co.nz/get-symfony2-working/entities/

+0

Hola, el último enlace se ha ido. – userfuser

Cuestiones relacionadas