Tworzenie i używanie formularzy w Symfony

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.

Co to jest Symfony Form Component i jaki ma praktyczny sens?

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ć.

1. Instalacja i konfiguracja formularzy Symfony

1.1 Instalacja Symfony Form Component

Jeśli w Twoim projekcie nie jest jeszcze zainstalowany Form Component, możesz go dodać poleceniem:

composer require symfony/form

1.2 Włączenie ochrony CSRF

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

2. Tworzenie formularza w Symfony

2.1 Definiowanie encji

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...
}
?>

2.2 Tworzenie formularza

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,
        ]);
    }
}
?>

3. Przetwarzanie formularza w kontrolerze

Dodanie formularza do kontrolera

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(),
        ]);
    }
}
?>

3.1 Wyświetlenie formularza w szablonie Twig

<!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>

Najczęściej zadawane pytania

1. Jak dodać walidację danych?

Dodaj walidację w encji za pomocą adnotacji:

use Symfony\Component\Validator\Constraints as Assert;

#[Assert\NotBlank]
private string $name;

#[Assert\Email]
private string $email;

2. Jak wstawić dane do formularza?

$form = $this->createForm(ContactFormType::class, [
    'name' => 'Wstępnie wypełnione imię',
]);

3. Jak dodać własne klasy CSS?

Użyj opcji attr:

->add('name', TextType::class, ['attr' => ['class' => 'form-control']])

Top 5 ciekawych faktów o formularzach Symfony

  1. Formularze Symfony mogą być powiązane bezpośrednio z encjami Doctrine.
  2. Wbudowana ochrona przed atakami CSRF zapewnia większe bezpieczeństwo.
  3. Symfony obsługuje przetwarzanie formularzy AJAX bez potrzeby odświeżania strony.
  4. Dzięki Form Extension możesz tworzyć własne elementy formularzy.
  5. Symfony oferuje integrację z popularnymi frameworkami JavaScript, takimi jak Vue.js czy React.

Chcesz nauczyć się Symfony?

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