Formulier afhandelen

Het formulier afhandelen

In de vorige twee paragrafen heb je geleerd hoe je een formulier maakt en deze kan controleren of het verstuurd is en de data klopt. In deze paragraaf gaan we verder kijken hoe we de data kunnen afhandelen. In ons voorbeeld is er nog steeds een entity Book waar we mee werken en zullen deze dan ook als zodanig gaan opslaan.

Verwerken in vijf stappen

Om de data te verwerken gebruiken we vijf stappen, waarvan een niet verplicht is.

  • Ophalen van de data uit het formulier
  • Voorbereiden van de data in de EntityManager
  • Verwerken van de EntityManager
  • Maken van een flash-message (niet verplicht)
  • Routeren naar de overzichtspagina na het opslaan

Ophalen van de data uit het formulier

Omdat we het formulier aan maken vanuit de BookType weet het formulier al dat we met de entity van Book werken. De data in het formulier wordt als zodanig ook opgeslagen. De data in het formulier is meteen een nieuwe Book entity.
Het ophalen van de data doe je met het volgende commando:
$book = $form->getData()
De variabele $book bevat nu een entity van het Book model.
Als je dit wilt controleren kan je een dd() (dump-and-die) op de variabele van het book doen. dd($book);

Voorbereiden van de data in de EntityManager

Omdat de code meteen in een Entity zit van Book, kunnen we deze direct aanbieden via de EntityManager. Deze hebben we in de vorige oefening al in de add-functie gezet in onze controller.
$entityManager->persist($book);
Met de ->persist() methode bereiden we het invoeren in de database voor.

Verwerken van de EntityManager

Als laatste gaan we de voorbereide data in de EntityManager doorspoelen, de voorbereide data wordt dan pas echt in de database gezet.
$entityManager->flush();

Maken van een flash-message (niet verplicht)

We willen graag dat onze gebruiker een bericht krijgen dat we iets gedaan hebben. Door het maken van flash-messages kunnen we dit makkelijk doen. Deze stap is niet verplicht, maar wel handig om te weten/ uit te voeren.
$this->addFlash('success', 'Het boek is toegevoegd');
De ->addFlash() functie heeft twee parameters, een het type (de label) van het bericht in het voorbeeld success en het tweede is het bericht zelf Het boek is toegevoegd.

Het tonen van de flash-message

Om de flash-message te tonen kan je in de base.twig.html of in een andere twig pagina de volgende code zetten:

{%  for label, messages in app.flashes %}
    {%  for msg in messages %}
        
{{ msg }}
{% endfor %} {% endfor %}
Voorbeeld van hoe je een flash-message kan tonen
Bovenstaande code in je TWIG file kijkt naar alle flash-messages en toont deze. Het zorg ervoor dat elke flash-message in een aparte div komt met een HTML-classes alert en alert- met de gegeven label (in ons voorbeeld success. Zo wordt, als je Bootstrap gebruikt, het bericht meteen netjes opgemaakt.

Routeren naar de overzichtspagina na het opslaan

Na het toevoegen van een boek willen we niet terug komen op de pagina om (nog) een boek toe te voegen maar willen we een routering maken naar het overzicht van alle boeken. De naam van die route in ons voorbeeld is app_book en daar gaan we de routering naar toe zetten.
return $this->redirectToRoute('app_book');
Deze code zet je IN de if-statement, niet er na of erbuiten. Meer over routeren lees je in het hoofdstuk van Routeren.

De gehele functie

//Use-space in de Controller
use App\Form\BookType;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;

//Functie om een boek toe te voegen verder op
public function add(Request $request, EntityManagerInterface $entityManager): Response
{
    $form = $this->createForm(BookType::class);
    $form->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid()) {
        $book = $form->getData();
        $entityManager->persist($book);
        $entityManager->flush();

        $this->addFlash('success', 'Het boek is toegevoegd');

        return $this->redirectToRoute('app_book');
    }

    return $this->render('book/add.html.twig', [
        'form' => $form
    ]);
}