Poznaliśmy form buildera, auto-wiring oraz entity manager, pora ich użyć tworząc post i edit route. Do dzieła.

Ok, nasza metoda pokazująca formularz:

#[Route('/micro_post/add', name: 'app_micro_post_add', priority: 2)]
    public function add(): Response
    {
        $microPost = new MicroPost();
        $form = $this->createFormBuilder($microPost)
            ->add('title')
            ->add('content')
            ->add('submit', SubmitType::class, ['label' => 'Save'])
            ->getForm();

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

Mówiłem, że będzie łatwo, choć inaczej niż w Laravelu. Przypomnijmy sobie, czym jest EntityManager i już możemy pisać kod:

 #[Route('/micro_post/add', name: 'app_micro_post_add', priority: 2)]
    public function add(Request $request, EntityManagerInterface $entityManager): Response
    {
        $microPost = new MicroPost();

        $form = $this->createFormBuilder($microPost)
            ->add('title')
            ->add('content')
            ->add('submit', SubmitType::class, ['label' => 'Save'])
            ->getForm();

        $form->handleRequest($request);

            if ($form->isSubmitted() && $form->isValid()) {

                $post = $form->getData();
                $entityManager->persist($post);
                $entityManager->flush();
                $this->addFlash('success', 'Your micro post have been addded.');

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

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

Ok, a edit route? Trzeba użyć auto-wiring i w zasadzie tak samo:

#[Route('/micro_post/{post}/edit', name: 'app_micro_post_edit')]
    public function edit(MicroPost $post, Request $request, EntityManagerInterface $entityManager): Response
    {
        
         $form = $this->createFormBuilder($post)
             ->add('title')
             ->add('content')
             ->add('submit', SubmitType::class, ['label' => 'Save'])
             ->getForm();
        
        $form->handleRequest($request);

            if ($form->isSubmitted() && $form->isValid()) {
                //$newpost = $form->getData();
                // $entityManager->persist($newpost);
                $entityManager->flush();
                $this->addFlash('success', 'Your micro post have been edited.');

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

Warto zwrócić uwagę, że w przypadku edit wykomentowane treści są opcjonalne, wystarczy flush, aby zapisać do bazy danych.

Mówi o tym dokumentacja Symfony, nie jest tak, że mi to z jakichś dziwnych przyczyn zadziałało:

class ProductController extends AbstractController
{
    #[Route('/product/edit/{id}', name: 'product_edit')]
    public function update(EntityManagerInterface $entityManager, int $id): Response
    {
        $product = $entityManager->getRepository(Product::class)->find($id);

        if (!$product) {
            throw $this->createNotFoundException(
                'No product found for id '.$id
            );
        }

        $product->setName('New product name!');
        $entityManager->flush();

        return $this->redirectToRoute('product_show', [
            'id' => $product->getId()
        ]);
    }
}

Dokładnie, dokumentacja mówi:

You can call $entityManager->persist($product), but it isn’t necessary: Doctrine is already „watching” your object for changes.

Więcej Symfony już wkrótce.