Pengenalan Controller dan Routing pada Symfony
I. Controller pada Symfony
Secara mudah, controller di Symfony adalah semua tipe callable, namun secara spesifik controller adalah semua class yang extends class Symfony\Bundle\FrameworkBundle\Controller\Controller dan memiliki method/action yang berakhiran Action. Untuk lebih jelas, mari kita lihat code controller yang ada di hasil instalasi kita.
1 <?php
2
3 namespace AppBundle\Controller;
4
5 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Ro\
6 ute;
7 use Symfony\Bundle\FrameworkBundle\Controller\Controlle\
8 r;
9 use Symfony\Component\HttpFoundation\Request;
10
11 class DefaultController extends Controller
12 {
13 /**
14 * @Route("/", name="homepage")
15 */
16 public function indexAction(Request $request)
17 {
18 // replace this example code with whatever you \
19 need
20 return $this->render('default/index.html.twig',\
21 [
22 'base_dir' => realpath($this->getParameter(\
23 'kernel.root_dir').'/..'),
24 ]);
25 }
26 }
Pada code diatas, controller DefaultController meng-extends Controller dan memiliki action indexAction. Controller di Symfony secara default tidak memiliki constructor, sebagai gantinya, dengan meng-extends Symfony\Bundle\FrameworkBundle\Controller\Controller Anda dapat mengakses semua fitur yang ada di Symfony.
Karena fokus kita pada pembahasan controller, maka baris code yang lainnya tidak kita bahas terlebih dahulu agar tidak melebar pembahasannya.
Setiap controller di Symfony wajib mengembalikan Response object.
II. Routing pada Symfony
Untuk konfigurasi routing di Symfony ada empat cara yaitu menggunakan** php, yml, xml dan annotation*. Namun pada buku ini hanya akan dibahas *routing menggunakan annotation sesuai dengan best practice Symfony.
Kembali pada contoh diatas, pada baris code berikut:
1 /**
2 * @Route("/", name="homepage")
3 */
Pada code diatas, adalah definisi dari route pada Symfony. Route diatas adalah / (root aplikasi) dengan nama homepage.
Untuk definisi dari route, sebenarnya dimulai dari routing.yml yang ada di folder app/config sebagai berikut:
1 app:
2 resource: "@AppBundle/Controller/"
3 type: annotation
Pada code diatas terlihat bahwa routing yang kita pakai adalah annotation dengan controller merujuk pada folder @AppBundle/Controller yaitu folder src/AppBundle/Controller.
Untuk mengetahui daftar route yang terregistrasi di Symfony, kita dapat menjalankan perintah berikut:
1 php app/console debug:router
Maka akan muncul tampilan sebagai berikut:
Kita juga bisa menambahkan prefix pada routing sebagai berikut:
1 app:
2 resource: "@AppBundle/Controller/"
3 type: annotation
4 prefix: /admin
Maka secara otomatis, semua routing pada @AppBundle/Controller akan dimulai dengan prefix /admin. Dan bila kita menjalankan perintah debug:router maka tampilannya akan menjadi seperti ini:
III. Route Parameter
Untuk mendefinisikan route parameter di Symfony sangatlah mudah, Anda cukup mendefinisikan sebagai berikut:
1 /**
2 * @Route("/{id}", name="homepage")
3 */
4 public function detailAction(Request $request, $id)
5 {
6 //do your logic
7 }
Penamaan untuk route parameter dan method parameter harus sama. Pada contoh diatas route parameter adalah {id} maka method parameter-nya harus $id. Sedangkan untuk parameter $request adalah optional. Jika tidak didefinisikan maka parameter pertama harus diisi route parameter. Sehingga code-nya akan menjadi seperti berikut:
1 /**
2 * @Route("/{id}", name="homepage")
3 */
4 public function detailAction($id)
5 {
6 //do your logic
7 }
IV. HTTP Method pada Symfony
Secara default, route di Symfony dapat diakses baik dengan method GET, POST, PUT, DELETE, ataupun PATCH. Untuk membatas akses tersebut, maka kita harus mendefinisikan method tersebut secara spesifik pada route kita.
Untuk mendefinisikan HTTP Method, kita dapat menggunakan annotation @Method yang berasal dari Sensio\Bundle\FrameworkExtraBundle\Configuration\Method sehingga controller kita akan menjadi seperti berikut:
1 <?php
2
3 namespace AppBundle\Controller;
4
5 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Me\
6 thod;
7 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Ro\
8 ute;
9 use Symfony\Bundle\FrameworkBundle\Controller\Controlle\
10 r;
11 use Symfony\Component\HttpFoundation\Request;
12
13 class DefaultController extends Controller
14 {
15 /**
16 * @Route("/", name="homepage")
17 * @Method("POST")
18 */
19 public function indexAction(Request $request)
20 {
21 // replace this example code with whatever you \
22 need
23 return $this->render('default/index.html.twig',\
24 [
25 'base_dir' => realpath($this->getParameter(\
26 'kernel.root_dir').'/..'),
27 ]);
28 }
29 }
Pada code diatas, kita hanya membolehkan method POST pada route homepage sehingga ketika kita mengaksesnya menggunakan browser akan muncul pesan error bahwa method GET tidak diperbolehkan sebagai berikut:
Kita juga dapat mendefinisikan lebih dari satu method pada route sebagai berikut:
1 <?php
2
3 namespace AppBundle\Controller;
4
5 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Me\
6 thod;
7 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Ro\
8 ute;
9 use Symfony\Bundle\FrameworkBundle\Controller\Controlle\
10 r;
11 use Symfony\Component\HttpFoundation\Request;
12
13 class DefaultController extends Controller
14 {
15 /**
16 * @Route("/", name="homepage")
17 * @Method({"POST", "GET"})
18 */
19 public function indexAction(Request $request)
20 {
21 // replace this example code with whatever you \
22 need
23 return $this->render('default/index.html.twig',\
24 [
25 'base_dir' => realpath($this->getParameter(\
26 'kernel.root_dir').'/..'),
27 ]);
28 }
29 }
Dan karena kita menambahkan method GET pada route homepage maka ketika kita mengakses halaman homepage, kita tidak akan mendapat pesan error lagi.