Formuláre sú základným prvkom webových aplikácií a v Symfony ponúkajú efektívny a bezpečný spôsob spracovania údajov. Vďaka Form Component v Symfony môžete jednoducho vytvárať, validovať a spracovávať formuláre.
Symfony Form Component umožňuje:
Vďaka Form Component v Symfony nemusíte písať HTML formuláre ručne, ale môžete ich generovať dynamicky a spracovávať ich jednoduchým spôsobom.
Ak vo vašom projekte ešte nie je nainštalovaný Form Component, môžete ho pridať príkazom:
composer require symfony/form
V Symfony sú formuláre automaticky chránené pred Cross-Site Request Forgery (CSRF) útokmi. Uistite sa, že v súbore config/packages/framework.yaml máte:
framework:
csrf_protection: true
Najskôr vytvorme jednoduchú entitu 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 a settery...
}
?>
V Symfony sa formuláre definujú v samostatnej triede. Vytvorme formulár 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' => 'Meno'])
->add('email', EmailType::class, ['label' => 'E-mail'])
->add('message', TextareaType::class, ['label' => 'Správa'])
->add('submit', SubmitType::class, ['label' => 'Odoslať']);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Contact::class,
]);
}
}
?>
Teraz vytvorme kontrolér, ktorý zobrazí a spracuje formulár:
<?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()) {
// Spracovanie formulára (uloženie do databázy, odoslanie e-mailu)
return $this->redirectToRoute('contact_success');
}
return $this->render('contact/index.html.twig', [
'form' => $form->createView(),
]);
}
}
?>
<!DOCTYPE html>
<html>
<head>
<title>Kontaktujte nás</title>
</head>
<body>
<h1>Kontaktujte nás</h1>
{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}
</body>
</html>
Pridajte validáciu do entity pomocou anotácií:
use Symfony\Component\Validator\Constraints as Assert; #[Assert\NotBlank] private string $name; #[Assert\Email] private string $email;
$form = $this->createForm(ContactFormType::class, [
'name' => 'Predvyplnené meno',
]);
Použite možnosť attr:
->add('name', TextType::class, ['attr' => ['class' => 'form-control']])
Ak máte záujem o prezenčné alebo online školenie programovania v PHP, pozrite si našu ponuku na www.like-it.sk. Naše kurzy vedú skúsení odborníci, ktorí vám pomôžu zvládnuť Symfony od základov až po pokročilé koncepty.
Viac informacií preberáme na kurze:
Kurz PHP - Programovanie dynamických webových stránok v PHP a úvod do AJAXu
Marián Knězek