2012-11-20 15 views
7

To, co chcę wiedzieć, to najlepszy sposób utworzenia formularza pasującego do obiektu.Tworzenie formularzy ZF 2 z Doctrine Entity

  • Ręcznie Utwórz formularz w kodzie lub przy użyciu adnotacji formularza?
  • Korzystanie z adnotacji z obiektu?

Widziałem kilka różnych przykładów, niektóre używające @Annotation i inne używające @Form? Czy ktoś mógłby wyjaśnić różnicę?

W przypadku podmiotów mających jednostki powiązane/zagnieżdżone, czy muszę dostarczyć niestandardową aplikację do nawadniania dla każdej jednostki? Przypuszczam, że Doctrine może już mieć taki, który implementuje interfejsy hydratora?

Podsumowując: - Najlepszy sposób na utworzenie formularza z Entity. - Różnica między @Form a @Annotation - Czy Doctrine ma Hydrator dla swoich jednostek?

Odpowiedz

11

Po pierwsze: Adnotacje są Speed-Killer. Jeśli chcesz korzystać z kreatora adnotacji, ZAWSZE buforuj utworzone obiekty. Ale adnotacje są również najłatwiejszym sposobem na uruchomienie formularza;)

Po drugie: Hydrator. Korzystając z ZF2 Forms w połączeniu z Doctrine 2, najprawdopodobniej chcesz użyć DoctrineEntity Hydrator znajdującego się w środku. Rozważmy następujący kod:

$form = new ReferenzwertForm(); 
$form->setHydrator(new DoctrineEntity($serviceLocator->get('Doctrine\ORM\EntityManager'))) 
    ->setObject(new Referenzwert()) 
    ->setInputFilter(new ReferenzwertFilter()) 
    ->setAttribute('method', 'post'); 
return $form; 
  • ReferenzwertForm() jest typu Zend\Form\Form Object
  • DoctrineEntity() jest typu DoctrineORMModule\Stdlib\Hydrator\DoctrineEntity
    • DoctrineEntity potrzebuje EntityManager dostarczone. należy zapoznać się z tym podczas korzystania Doctrine 2 w ZF2
  • Referenzwert() jest podmiotem-Object

Kiedy nie używając adnotacji i jesteś przedstawieniu innego podmiotu, a następnie upewnij się, użyj odpowiedni element formularza (w większości przypadków będzie to select-elementem (podobnie jak wybranie CategoryEntity dla BlogEntity lub coś)

$this->add(array(
    'name' => 'type', 
    'type' => 'DoctrineORMModule\Form\Element\DoctrineEntity', 
    'options' => array(
      'label' => 'Choose a MyEntity', 
      'object_manager' => $this->getEntityManager(), 
      'target_class' => 'Namespace\Entity\MyEntity', 
      'property' => 'name' 
    ), 
    'attributes' => array(
     'required' => true 
    ) 
)); 

jak widać, element formularz musi wiedzieć o EntityManager też. to dlaczego idealnie chcesz ext zakończ pierwszy przykład kodu z innym programem ustawiającym, aby wprowadzić obiekt entityManager do obiektu formularza.

$form->setEntityManager($serviceLocator->get('Doctrine\ORM\EntityManager')) 
    ->set()//all the other stuff 

Jakie jest najlepsze podejście w ogóle? Powiedziałbym, że nie ma. Dla celów szybkościowych adnotacje są wyłącznie zabójcą. Używanie buforowanych wersji powinno pomóc, chociaż nie mam jeszcze osobistego doświadczenia z buforowaniem w ZF2. Lubię tworzyć moje formularze z rąk poza adnotacjami, po prostu dlatego, że mój IDE obsługuje wiele rzeczy, ale z pewnością nie tworzą adnotacji: D

Mam nadzieję, że to może ci pomóc i nie napisałem zbyt wiele z kontekst: P

+0

Dobra odpowiedź, dzięki. Czy mam rację, zakładając, że Twój przykład kodu z klasą target itd. Może zostać przekonwertowany na adnotacje?Nie wydaje mi się, aby wydajność była poważnym problemem w tych obszarach, a buforowanie to coś, co możemy wdrożyć, jeśli zajdzie taka potrzeba. – Ben

+0

Nie pracowałem dotąd z adnotacjami, więc nie mogę powiedzieć dokładnie. Wiem, że parsowanie to olbrzymi wynik, dlatego od niego odejdę. Wystarczy, że już parsuję obiekty;) 'target_class' definiuje jednostkę, która ma być wyświetlana, a' własność' jest właściwością, która jest wyświetlana wewnątrz elementu wyboru – Sam

+0

Nie mam wrażenia, że ​​wynik działania jest znikomy w formularzach. Czy masz na to dowód? W przeciwnym razie próbka kodu działała świetnie. Dzięki za całą pomoc. – Ben