Cytat
czy listenerów i usług ładnie jest używać do kodu jednokrotnego użytku byle odchudzić kontroler? Np gdybym chciał wepchnąć cały kod z powyższego if($form->isValid()){ do listenera/usługi.
Tak, stwierdzenie "odchudzenia" kontrolera nie do końca jest tutaj poprawne, zgodnie z założeniami
SOLID, a dokładniej samego
Single
Responsibility
Principle, powinieneś budować architekturę tak, żeby każdy z wytworzonych przez Ciebie obiektów miał
1 odpowiedzialność, nie zawsze niestety jest to takie proste, polecam przeczytać
TO.
W SF2/3 założeniem kontrolera (mówiąc dokładniej, akcji w kontrolerze) jest zebranie wszystkich odpowiednich danych, przemielenie tego poprzez usługi (serwisy) i wyplucie Response'a, tak powinna wyglądać "logika" akcji w kontrolerze.
Jak możesz uprościć kod który podałeś.
Moja prywatna opinia$session = $request->getSession();
$em = $this->getDoctrine()->getManager();
$logged = $this->get('security.authorization_checker')
->isGranted('IS_AUTHENTICATED_FULLY');
1. Masz dostępny serwis
session2. Masz dostępną metodę
$logged = $this-getUser() instanceof UserInterface;
// lub po prostu
$this->isGranted('ROLE_USER');
//Jak chcesz wywalić 403
$this->denyAccessUnlessGranted('ROLE_USER');
---Ogólnie polecam sprawdzenie metod obiektów które rozszerzasz

Cytat
$ksiazka = $this->getDoctrine()
->getRepository('AppBundle:Ksiazka')
->find($isbn);
$isbn=$ksiazka->getIsbn();
$tytul=$ksiazka->getTytul();
$autor=$ksiazka->getAutor();
$cena=$ksiazka->getCena();
$rokwydania=$ksiazka->getRokwydania();
$ilosc=$quantity;
$zamowienieProdukt = new ZamowienieProdukt();
$zamowienieProdukt->setIdzamowienie($zamowienie);
$zamowienieProdukt->setIsbn($ksiazka);
$zamowienieProdukt->setTytul($tytul);
$zamowienieProdukt->setAutor($autor);
$zamowienieProdukt->setCenaproduktu($cena);
$zamowienieProdukt->setRokwydania($rokwydania);
$zamowienieProdukt->setIlosc($ilosc);
Machnij do tego jakiś transformer o ile już musisz robić to w taki sposób, lub przemyśl, czy Twój formularz na prawdę musi działać tak topornie? Jeżeli musi, to może
To Ci jakoś ułatwi pracę.
Cytat
return $this->redirect($this->generateUrl('potwierdzenie'));
// a może po prostu tak: return $this->redirectToRoute('potwierdzenie');
Ogólnie, to do ogrania forma użyam handlera, a ten z innych udogodnień, które przejmują pewną część procesu.
Możesz zainteresować się
takim rozwiązaniem, napisać własne, lub zupełnie to olać, ale pamiętaj, że im bardziej coś podzielisz, tym łatwiej będzie Ci wpływać na kod w przyszłości, testować go jak i wymieniać poszczególne "komponenty".