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