2012-02-06 8 views
6

Powiedzmy mam zwykły *Type Klasa:Jak uzyskać instancję repozytorium jednostek w klasie Form (Type) w Symfony 2?

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

i jedno z pól jest rodzajem choice. Wartości, które muszą być użyte jako elementy wyboru, powinny zostać pobrane z bazy danych (z jakiegoś konkretnego repozytorium jednostek).

Pytanie brzmi: jak uzyskać repozytorium w klasie LocationType? Czy przekazanie go przez konstruktora jest jedynym sposobem, aby go zdobyć?

UPD:

wiem o entity typ, ale niestety nie mogę go używać, ponieważ moja nieruchomość nie jest i nie może być zdefiniowana jako one-to-one relacji ze względu na bardzo złożonych warunkach relacji tej doktryny nie obsługuje (jeszcze ?). Zobacz How to specify several join conditions for 1:1 relationship in Doctrine 2 dodatkowych szczegółów

Odpowiedz

9

Można określić typ pola podmiot jako opcja tak:

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

EDIT: Właściwie opcja „klasa” jest jedyną opcją wymagane pola. Możesz przeczytać nieco więcej o polu typu encji tutaj: http://symfony.com/doc/2.0/reference/forms/types/entity.html

Mam nadzieję, że to pomaga.

EDIT:

Dalsze dyskusji poniżej, to przykładowy

W regulatorze:

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

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

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

Tablica $options przepuszcza sposobu FooType::buildForm() tak foo_repository powinien być w dostępne w tej metodzie, jak poniżej:

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

Nie mogę tego zrobić, ponieważ moja własność 'foo' nie jest zdefiniowana jako żadna relacja (" jeden do jednego "lub jakakolwiek inna), ponieważ relacja jest zdefiniowana w bardzo trudny sposób, który doktryna obecnie nie obsługuje. http://stackoverflow.com/questions/9123264/how-to-specify-several-join-conditions-for-11-relationship-in-doctrine-2 - tutaj jest pytanie, które wyjaśnia przypadek – zerkms

+0

Niestety, nie zrobiłem tego t podać tak istotne szczegóły w pierwszej wersji pytania, +1 za pomoc w każdym razie. Jakieś inne myśli? – zerkms

+0

Hi. Nie ma problemu. Być może i tak przeczytałem twoje pytanie zbyt szybko! Proponuję '$ this-> buildForm (typ $, encja $, array ('reository' => $ er))' w twoim kontrolerze, aby przekazać klasę repozytorium jako opcję do twojego formularza, ale myślę, że biorąc pod uwagę twoje pytanie chcesz tego uniknąć. –

Powiązane problemy