2011-09-17 12 views
15

Tengo una entidad llamada Game con un repositorio relacionado llamado GameRepository:¿Cómo obtener un repositorio de una entidad?

/** 
* @ORM\Entity(repositoryClass="...\GameRepository") 
* @ORM\HasLifecycleCallbacks() 
*/ 
class Game { 
    /** 
    * @ORM\prePersist 
    */ 
    public function setSlugValue() { 
     $this->slug = $repo->createUniqueSlugForGame(); 
    } 
} 

En el método PrePersist, tengo que asegurar que el campo babosa del juego es único, lo que requiere una consulta de base de datos. Para hacer la consulta, necesito acceder al EntityManager. Puedo obtener EntityManager desde GameRepository. Entonces: ¿cómo obtengo el GameRespository de un juego?

Respuesta

9

No es así. Las entidades en Doctrine 2 se supone que deben saber del administrador de entidades o el repositorio.

Una solución típica para el caso que presente sería agregar un método al repositorio (o una clase de servicio) que se usa para crear (o llamar para almacenar) instancias nuevas, y también produce un valor de slug único.

+2

¿Por qué eligieron hacerlo de esa manera? Parece hacer todo mucho más difícil y menos SECO. –

+0

@JasonSwett Sí, la caja de babosas es un poco molesta como esa. En la mayoría de los otros casos, la separación tiene menos lados negativos, como cuando se prueban cosas es mucho más fácil cuando no hay dependencias difíciles de configurar. –

+1

Un método en el repositorio para "crear nuevas instancias" ... ¿En serio? ¿El repositorio no está destinado a solo obtener datos? – Jean

1

Para mantener la lógica encapsulada sin tener que cambiar la forma de guardar la entidad, en lugar del simple evento del ciclo de vida del prePersist tendrá que mirar usando los eventos de Doctrine más potentes que pueden tener acceso a algo más que el entidad misma.

Probablemente deberías mirar los paquetes DoctrineSluggableBundle o StofDoctrineExtensionsBundle que pueden hacer justo lo que necesitas.

4

se puede inyectar el gestor de la entidad doctrina en su entidad (usando JMSDiExtraBundle) y tener el repositorio de la siguiente manera:

/** 
* @InjectParams({ 
*  "em" = @Inject("doctrine.orm.entity_manager") 
* }) 
*/ 
    public function setInitialStatus(\Doctrine\ORM\EntityManager $em) { 


    $obj = $em->getRepository('AcmeSampleBundle:User')->functionInRepository(); 
    //... 
} 

ver esto: http://jmsyst.com/bundles/JMSDiExtraBundle/1.1/annotations

48

En realidad puede obtener el repositorio en su entidad y solo durante una devolución de llamada del ciclo de vida. Estás muy cerca de él, todo lo que tienes que hacer es recibir el parámetro LifecycleEventArgs.

Véase también http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html

use Doctrine\ORM\Event\LifecycleEventArgs; 

/** 
* @ORM\Entity(repositoryClass="...\GameRepository") 
* @ORM\HasLifecycleCallbacks() 
*/ 
class Game { 
    /** 
    * @ORM\prePersist 
    */ 
    public function setSlugValue(LifecycleEventArgs $event) { 
     $entityManager = $event->getEntityManager(); 
     $repository = $entityManager->getRepository(get_class($this)); 

     $this->slug = $repository->createUniqueSlugForGame(); 
    } 
} 

PS. Sé que esta es una pregunta antigua, pero la contesté para ayudar a futuros usuarios de Google.

+5

Me alegra que lo hayas resucitado, yo era uno de esos futuros Googlers. En realidad, ya estaba trabajando en una devolución de llamada del ciclo de vida y persistiendo en que mi objeto dependía de la creación o recuperación de un objeto relacionado. – nealio82

+2

Trabajando para mí (Symfony 2.4), ¡creo que esta sería la respuesta aceptada! – mboullouz

+0

Future googler -> – Prof83

Cuestiones relacionadas