Ketika membuat sistem menggunakan PHP, besar kemungkinan kita akan menggunakan form untuk menerima input. Namun menggunakan form akan sangat melelahkan karena kita akan menuliskan kode yang berulang-ulang seperti pembuatan input, validasi dll.Di Symfony kita disediakan component Form yang akan mempersingkat waktu kita dalam membangun sebuah sistem.
Untuk menggunakan komponen form, kita bisa melakukan instalasi dengan menggunakan composer:
composer require symfony/form
tunggu beberapa saat sampai proses instalasi selesai.
Penggunaan Form
Kita punya sebuah entity Task yang kita anggap sebagai representasi dari tabel task seperti kode berikut:
<?php namespace App\Entity; /** * Description of Task * * @author apple */ class Task { protected $task; protected $dueDate; public function getTask(): string { return $this->task; } public function setTask(string $task): void { $this->task = $task; } public function getDueDate(): ?\DateTime { return $this->dueDate; } public function setDueDate(?\DateTime $dueDate): void { $this->dueDate = $dueDate; } }
pada class diatas, kita mempunyai 2 buah attribute yaitu task dan dueDate; Kemudian kita akan membuat form input untuk Entity tersebut yang berfungsi untuk menerima input dari user.
Kemudian kita akan membuat controller yang akan berisi kode untuk membuat object form dan melakukan render ke file twig dan mengembalikannya menjadi object response seperti kode berikut.
<?php namespace App\Controller; use App\Entity\Task; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\Extension\Core\Type\DateType; use Symfony\Component\Routing\Annotation\Route; /** * Description of FormController * @Route("/task", name="task_") * @author apple */ class TaskController extends AbstractController { /** * @Route("/create", name="create") * @param Request $request * @return Response */ public function create(Request $request):Response { $task = new Task(); $form = $this->createFormBuilder($task) ->add('task', TextType::class) ->add('dueDate', DateType::class) ->getForm(); // ----- kode untuk memproses form --- // kode untuk render ke file twig } }
kode diatas merupakan kode untuk kita membuat object form yang nanti akan kita render di file twig. Kode di atas nampak bahwa kita menambahkan beberapa input menggunakan function ->add() yang di ikuti dengan nama attribute serta tipe inputnya. Pastikan nama attributenya sama persis dengan attribute yang ada di entity.
Render Form
Setelah kita membuat object form, kita siapkan file twig yang berfungsi melakukan parsing dari object form menjadi syntax html seperti kode berikut:
{% extends "base.html.twig" %} {% block body %} {{ form_start(form) }} {{ form_widget(form) }} <button type="submit" value="1"> Simpan </button> {{ form_end(form) }} {% endblock %}
kemudian kita panggil file twig tadi di controller, sehingga controller kita menjadi seperti berikut.
<?php namespace App\Controller; use App\Entity\Task; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\Extension\Core\Type\DateType; use Symfony\Component\Routing\Annotation\Route; /** * Description of FormController * @Route("/task", name="task_") * @author apple */ class TaskController extends AbstractController { /** * @Route("/create", name="create") * @param Request $request * @return Response */ public function create(Request $request):Response { $task = new Task(); $form = $this->createFormBuilder($task) ->add('task', TextType::class) ->add('dueDate', DateType::class) ->getForm(); // ----- kode untuk memproses form --- // kode untuk render ke file twig return $this->render("task.html.twig", [ "form" => $form->createView() ]); } }
pada controller di atas, kita tambahkan kode untuk melakukan render file twig yang sudah kita buat untuk menjadi object response dengan parameter berisi object FormView yang kita peroleh dengan memanggil function $form->createView().
Memproses Form
Secara default, form yang dikirim akan mennunakan method POST. untuk menangkap / mengambil data yag kita kirim menggunakan form, kita modifikasi controller kita sebelumnya menjadi seperti berikut.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | <?php namespace App\Controller; use App\Entity\Task; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\Extension\Core\Type\DateType; use Symfony\Component\Routing\Annotation\Route; /** * Description of FormController * @Route("/task", name="task_") * @author apple */ class TaskController extends AbstractController { /** * @Route("/create", name="create") * @param Request $request * @return Response */ public function create(Request $request):Response { $task = new Task(); $form = $this->createFormBuilder($task) ->add('task', TextType::class) ->add('dueDate', DateType::class) ->getForm(); // ----- kode untuk memproses form --- if (Request::METHOD_POST === $request->getMethod()) { $form->handleRequest($request); if ($form->isValid()) { $task = $form->getData(); // kode untuk memproses data yang sudah di inputkan melalui form // seperti menyimpan ke database dll. } return $this->redirectToRoute("task_create"); } // kode untuk render ke file twig return $this->render("task.html.twig", [ "form" => $form->createView() ]); } } |
untuk memproses data yang kita kirim melalui form, kita fokus ke kode baris 34 sampai baris 44.
DIsana, jika method nya post, maka dijalankan function handleRequest() yang berfungsi untuk menangkap data yang dikirim dari request untuk di proses menjadi object Task. Kemudian isValid() untuk melakukan validasi apakah input yang kita kirim telah sesuai dengan rule validasi yang telah kita buat. Untuk validasi form akan kita bahas di tulisan selanjutnya. Kemudian untuk mengambil data yang sudah siap, kita bisa menggunakan function getData() yang nanti kita proses ke proses lain seperti simpan ke database dll.
Memisahkan Class Form Dari Controller
Kode sebelumnya kita sudah praktek membuat Controller beserta form. Namun cara ini kurang saya rekomendasikan karena Controller akan semakin panjang juga apabila kita akan membuat form yang sama di function / Controller yang lain, kita harus menukis ulang kode untuk membuat form. Karena itu disarankan untuk memisahkan antara Form Class dengan Controller.
Buat Folder Form di src kemudian buat Class TaskType seperti kode berikut.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php // src/Form namespace App\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; /** * Description of TaskType * * @author apple */ class TaskType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options): void { $builder ->add('task', TextType::class) ->add('dueDate', DateType::class) ; } } |
kemudian modifikasi Controller kita menjadi seperti berikut.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | <?php namespace App\Controller; use App\Entity\Task; use App\Form\TaskType; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; /** * Description of FormController * @Route("/task", name="task_") * @author apple */ class TaskController extends AbstractController { /** * @Route("/create", name="create") * @param Request $request * @return Response */ public function create(Request $request):Response { $task = new Task(); $form = $this->createForm(TaskType::class, $task); // ----- kode untuk memproses form --- if (Request::METHOD_POST === $request->getMethod()) { $form->handleRequest($request); if ($form->isValid()) { $task = $form->getData(); // kode untuk memproses data yang sudah di inputkan melalui form // seperti menyimpan ke database dll. } return $this->redirectToRoute("task_create"); } // kode untuk render ke file twig return $this->render("task.html.twig", [ "form" => $form->createView() ]); } } |
Fokus di kode baris 27. kode kita sebelumnya yang membuat object form secara manual, kali ini kita buat object form dari class TaskType.
Selanjutnya
ini adalah tulisan awal seri belajar form di symfony. Pada tulisan selanjutnya kita akan menyelam lebih dalam untuk lebih mengenal Form di symfony
Komentar
Posting Komentar