Poznajemy form builder w Symfony. Nie lubię form builderów, moim zdaniem komplikują niepotrzebnie to, co każdy umie napisać z zamkniętymi oczami. W Symfony ich jednak używamy.
Ok, tworzymy add.html.twig:
{% extends 'base.html.twig' %}
{% block title %}Create New Post{% endblock %}
{% block body %}
{{ form(form) }}
{% endblock %}
Teraz tworzymy metodę:
#[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
]
);
}
Priorytet, aby się nam nie gryzło. Ok, tutaj pięknie nam formularz wytworzy, musimy tylko jeszcze doimportować SubmitType:
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\HttpFoundation\Request;
Od razu doimportowałem TextType i Request, przyda się w następnym przykładzie – formularz GETowy:
#[Route('/getform', name: 'app_get_form', priority: 2)]
public function getform(): Response
{
$form = $this->createFormBuilder()
->setAction($this->generateUrl('app_get_name'))
->setMethod('GET')
->add('user_name', TextType::class)
->add('save', SubmitType::class)
->getForm();
return $this->render(
'micro_post/add.html.twig',
[
'form' => $form
]
);
}
Wszystko mogę zrozumieć, i dziwny wzorzec Repository-Entity i cały ten Doctrine zamiast Eloquenta i Laravelowego podejścia, ale żeby tak się musieć bawić, aby stworzyć zwykły formularz GET?
I jeszcze on nam zapisuje te dane jako tablica. Ok, napiszmy metodę, która będzie odczytywać te dane:
#[Route('/getname', name: 'app_get_name', priority: 2)]
public function getname(Request $request): Response
{
return new Response("<b>Hello " .$request->query->all('form')['user_name']. "</b>" );
}
Symfrony jest „świetnie udokumentowane”, zwłaszcza jak na framework, który jest skokowo trudniejszy niż taki Laravel, gdzie wszystko jest opisane z przykładami jak dla małych dzieci.
Ok, skoro już jesteśmy w temacie: tak się pobiera $_GET (normalne, nie w formie tablicy) w Symfony:
$request->query->get('id');
A tak pobieramy POST:
$request->getPayload()->get('category', 'default category');
Nieczęsto będziemy to robić, bo Symfony choć komplikuje życie w jednej dziedzinie, to ułatwia w drugiej i niedługo poznamy, jak bajecznie proste jest submitowanie formularzy i zapisywanie do bazy danych.
Tym niemniej – getPayload to odpowiednik $_POST, jeżeli kiedykolwiek będziemy tego potrzebować.
Natomiast wartości tablicowe z geta pobieramy tak:
$request->query->all('form')['user_name']
Sam się Symfony powoli uczę i przyznaję, że jest skokowo trudniejsze, z drugiej strony istnieją zalety tego podejścia w stosunku do podejścia Laravelowego, choć koniec końców jedno i drugie to świetne frameworki, którymi zrobisz wszystko.