Formularze są podstawowym elementem aplikacji internetowych, a w Symfony oferują efektywny i bezpieczny sposób przetwarzania danych. Dzięki Form Component w Symfony możesz łatwo tworzyć, walidować i przetwarzać formularze.
Symfony Form Component umożliwia:
Dzięki Form Component w Symfony nie musisz ręcznie pisać formularzy HTML, ale możesz je generować dynamicznie i łatwo przetwarzać.
Jeśli w Twoim projekcie nie jest jeszcze zainstalowany Form Component, możesz go dodać poleceniem:
composer require symfony/form
W Symfony formularze są automatycznie chronione przed atakami Cross-Site Request Forgery (CSRF). Upewnij się, że w pliku config/packages/framework.yaml
masz:
framework: csrf_protection: true
Najpierw stwórzmy prostą encję Contact
:
<?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; #[ORM\Entity] class Contact { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column(type: 'integer')] private int $id; #[ORM\Column(type: 'string', length: 100)] private string $name; #[ORM\Column(type: 'string', length: 255)] private string $email; #[ORM\Column(type: 'text')] private string $message; // Gettery i settery... } ?>
W Symfony formularze definiuje się w osobnej klasie. Stwórzmy formularz ContactFormType
:
<?php namespace App\Form; use App\Entity\Contact; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\Extension\Core\Type\EmailType; use Symfony\Component\Form\Extension\Core\Type\TextareaType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\OptionsResolver\OptionsResolver; class ContactFormType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('name', TextType::class, ['label' => 'Imię']) ->add('email', EmailType::class, ['label' => 'E-mail']) ->add('message', TextareaType::class, ['label' => 'Wiadomość']) ->add('submit', SubmitType::class, ['label' => 'Wyślij']); } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ 'data_class' => Contact::class, ]); } } ?>
Teraz stwórzmy kontroler, który wyświetli i przetworzy formularz:
<?php namespace App\Controller; use App\Entity\Contact; use App\Form\ContactFormType; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; class ContactController extends AbstractController { #[Route('/kontakt', name: 'contact')] public function contact(Request $request): Response { $contact = new Contact(); $form = $this->createForm(ContactFormType::class, $contact); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { // Przetwarzanie formularza (zapis do bazy danych, wysyłanie e-maila) return $this->redirectToRoute('contact_success'); } return $this->render('contact/index.html.twig', [ 'form' => $form->createView(), ]); } } ?>
<!DOCTYPE html> <html> <head> <title>Skontaktuj się z nami</title> </head> <body> <h1>Skontaktuj się z nami</h1> {{ form_start(form) }} {{ form_widget(form) }} {{ form_end(form) }} </body> </html>
Dodaj walidację w encji za pomocą adnotacji:
use Symfony\Component\Validator\Constraints as Assert; #[Assert\NotBlank] private string $name; #[Assert\Email] private string $email;
$form = $this->createForm(ContactFormType::class, [ 'name' => 'Wstępnie wypełnione imię', ]);
Użyj opcji attr
:
->add('name', TextType::class, ['attr' => ['class' => 'form-control']])
Jeśli chcesz wziąć udział w szkoleniu programowania online lub stacjonarnym, zapoznaj się z naszą ofertą na www.like-it.sk. Nasze kursy prowadzą doświadczeni specjaliści, którzy nauczą Cię Symfony od podstaw po zaawansowane techniki.
Marián Knězek