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.