2012-02-06 11 views
6

Digamos que tengo ordinaria clase *Type:¿Cómo obtener una instancia del repositorio de entidades en la clase Form (Type) en Symfony 2?

class LocationType extends AbstractType 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder 
      ->add(...) 
      ... 
    } 
} 

y uno de los campos es un tipo choice. Se supone que los valores que deben utilizarse como elementos de elección se recuperan de la base de datos (desde algún repositorio de entidad particular).

Entonces la pregunta es: ¿cómo obtener el repositorio en la clase LocationType? ¿Pasarlo por el constructor es la única forma de obtenerlo?

UPD:

que sé de entity tipo, pero por desgracia no puedo usarlo, porque mi propiedad no es y no puede ser definida como one-to-one relación debido a las condiciones de relaciones muy complejas que Doctrina no soporta (aún ?). Ver How to specify several join conditions for 1:1 relationship in Doctrine 2 para obtener detalles adicionales

Respuesta

9

Puede especificar un tipo de campo entidad como una opción, así:

$builder 
    ->add('foo', 'entity', array(
     'class' => 'FooBarBundle:Foo', 
     'query_builder' => function(\Doctrine\ORM\EntityRepository $er) { 
      return $er->createQueryBuilder('q')->orderBy('q.name', 'ASC'); 
     }, 
    )); 

EDITAR: En realidad, la opción de 'clase' es la única opción campo obligatorio. Puede leer un poco más sobre el tipo de campo de entidad aquí: http://symfony.com/doc/2.0/reference/forms/types/entity.html

Espero que esto ayude.

EDITAR:

Además de discusión a continuación, aquí es un ejemplo

en el controlador:

$entity = new Foo(); 
$type = new FooType(); 

$er = $this->getDoctrine() 
    ->getEntityManager() 
    ->getRepository('FooBarBundle:Foo'); 

$form = $this->createForm($type, $entity, array(
    'foo_repository' => $er 
)); 

La matriz $options se pasa al método FooType::buildForm(), por lo foo_repository entonces debe haber disponible en este método como tal:

$er = $options['foo_repository']; 
+0

No puedo hacerlo, porque mi propiedad 'foo' no se define como ninguna relación (' uno-a-uno' o cualquier otro) debido a la relación que se define de manera muy difícil que la doctrina actualmente no admite. http://stackoverflow.com/questions/9123264/how-to-specify-several-join-conditions-for-11-relationship-in-doctrine-2 - aquí está la pregunta que explica el caso – zerkms

+0

Lo siento, no lo hice. t especificar detalles tan significativos en la primera revisión de la pregunta, +1 para la ayuda de todos modos. ¿Algún otro pensamiento? – zerkms

+0

Hola. No hay problema. ¡Podría haber leído tu pregunta demasiado rápido de todos modos! Sugeriría '$ this-> buildForm ($ type, $ entity, array ('repository' => $ er))' en tu controlador para pasar la clase del repositorio como una opción a tu formulario, pero supongo que dada tu pregunta estás buscando evitar esto. –

Cuestiones relacionadas