Langsung ke konten utama

Membuat API CRUD di Symfony 4

Melanjutkan tulisan saya sebelumnya tentang symfony 4, kali ini saya akan lanjutkan menulis tentang membuat CRUD API di symfony. Untuk melakukan request / post data, di tulisan saya kali ini saya menggunakan aplikasi POSTMAN yang bisa anda download di https://www.getpostman.com/. Jika anda belum membaca tulisan saya sebelumnya tentang Doctrine, bisa dibaca di https://catatan-pemrograman.blogspot.com/2018/09/menggunakan-doctrine-di-symfony-4.html

Membuat Controller

Untuk membuat controller, kita manfaatkan generator dari MakerBundle seperti ketika kita membuat entity pada tulisan saya sebelumnya. Untuk membuat controller, silahkan jalankan perintah berikut di command line : 
php bin/console make:controller
dan beri nama controllernya ApiController seperti pada gambar berikut : 

maka kita akan punya controller baru di dalam folder src/Controller.

<?php // src/Controller/ApiController.php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
class ApiController extends AbstractController
{
/**
* @Route("/api", name="api")
*/
public function index()
{
return $this->json([
'message' => 'Welcome to your new controller!',
'path' => 'src/Controller/ApiController.php',
]);
}
}

Membuat Halaman List Data

nah sekarang kita buat halaman index untuk menampilkan list data category. Kita ubah function index menjadi seperti berikut.

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use App\Entity\MCategory;
use Symfony\Component\HttpFoundation\Request;

class ApiController extends AbstractController
{
    /**
     * @Route("/api", name="api")
     */
    public function index()
    {
        $repository = $this->getDoctrine()->getRepository(MCategory::class);
        $MCategorys = $repository->findAll();
        $datas = [];
        foreach($MCategorys as $MCategory) {
            $datas[] = [
                'id' => $MCategory->getId(),
                'code' => $MCategory->getCode(),
                'name' => $MCategory->getName()
            ];
        }
        return $this->json($datas);
    }
    
}
dan kemudian silahkan panggil di browser / menggunakan POSTMAN sehingga akan menghasilkan output JSON seperti berikut :

sampai disini ada yang masih bingung ? kita lanjut membuat halaman input data baru / insert data

Membuat Halaman Input Data

kita buat function baru bernama create, seperti berikut, 

<?php // src/Controller/ApiController.php
namespace App\Controller;
....
use Symfony\Component\HttpFoundation\Request; // tambahkan kode berikut
class ApiController extends AbstractController
{
....
/**
* @Route("/api/insert", name="api_category_insert", methods={"GET","POST"})
*/
public function insert(Request $request)
{
}
}
pada function insert method yang saya ijinkan adalah GET dan POST dan saya sertakan parameter berupa objek dari class Request. Kemudian tambahkan kode berikut,

<?php // src/Controller/ApiController.php
namespace App\Controller;
....
use Symfony\Component\HttpFoundation\Request; // tambahkan kode berikut
class ApiController extends AbstractController
{
....
/**
* @Route("/api/insert", name="api_category_insert", methods={"GET","POST"})
*/
public function insert(Request $request)
{
$datas = [
'name' => 'category',
'fields' => [
['name' => 'code', 'type' => 'text', 'required' => true],
['name' => 'name', 'type' => 'text', 'required' => true],
]
];
if($request->getMethod() === Request::METHOD_POST) {
// jika method POST
}
return $this->json($datas);
}
}
jika url di akses menggunakan method GET, maka akan mengembalikan data berupa JSON yang merupakan format isian yang bisa digunakan saat melakukan POST data. Sekarang kira coba akses menggunakan POSTMAN untuk mengirim data menggunakan method POST.  Berikut contoh saat kita akses menggunakan method GET : 

kemudian kita ubah function insert menjadi seperti berikut : 

<?php // src/Controller/ApiController.php

namespace App\Controller;
....
use Symfony\Component\HttpFoundation\Request; // tambahkan kode berikut

class ApiController extends AbstractController
{
    ....
    
    /**
     * @Route("/api/insert", name="api_category_insert", methods={"GET","POST"})
     */
    public function insert(Request $request)
    {
        $datas = [
            'name' => 'category', 
            'fields' => [
                ['name' => 'code', 'type' => 'text', 'required' => true],
                ['name' => 'name', 'type' => 'text', 'required' => true],
                ]
            ];
        if($request->getMethod() === Request::METHOD_POST) { // jalankan jika method POST
            $data = $request->get($datas['name']);
            // validasi data
            if(empty($data)) {
                $result = ['status' => false, 'messages' => 'format tidak valid.'];
                return $this->json($result);
            }
            foreach($datas['fields'] as $field) {
                if($field['required']) {
                    if(!isset($data[$field['name']])) {
                        $result = ['status' => false, 'messages' => 'format tidak valid ('.$field['name'].' is required)'];
                        return $this->json($result);
                    }else{
                        if(empty($data[$field['name']])) {
                            $result = ['status' => false, 'messages' => $field['name'].' is required.'];
                            return $this->json($result);
                        }
                    }
                }
            }
            
            // kita definisikan entity manager
            $entityManager = $this->getDoctrine()->getManager();
            // membuat object category dan set value
            $MCategory = new MCategory();
            $MCategory->setCode($data['code']);
            $MCategory->setName($data['name']);
            // menyimpan object ke database
            $entityManager->persist($MCategory);
            $entityManager->flush();

            return $this->json(['status' => true, 'messages' => 'saved data successfully.', 'id' => $MCategory->getId()]);
        }
        
        return $this->json($datas);
    }
}
dan sekarang kita coba kirim data menggunakan method POST.
nah sampai disini kita sudah selesai membuat halaman insert data, selanjutnya kita coba buat halaman edit data.

Halaman Edit Data

sekarang buat function baru bernama update() seperti berikut ini,

<?php // src/Controller/ApiController.php

namespace App\Controller;

....

class ApiController extends AbstractController
{
    /**
     * @Route("/api", name="api")
     */
    public function index()
    {
        ....
    }
    
    /**
     * @Route("/api/insert", name="api_category_insert", methods={"GET","POST"})
     */
    public function insert(Request $request)
    {
        ....
    }
    
    /**
     * @Route("/api/update/{id}", name="api_category_update", methods={"GET","POST"})
     */
    public function update($id = null, Request $request)
    {
        if(is_null($id)){
            return $this->json(['status' => false, 'messages' => 'id tidak boleh kosong']);
        }
        
        // mengambil data berdasarkan id
        $repository = $this->getDoctrine()->getRepository(MCategory::class);
        $MCategory = $repository->find($id);
        if(!$MCategory) {
            return $this->json(['status' => false, 'messages' => 'object tidak ditemukan.']);
        }
        $datas = [
            'name' => 'category', 
            'fields' => [
                ['name' => 'code', 'type' => 'text', 'required' => true, 'value' => $MCategory->getCode()],
                ['name' => 'name', 'type' => 'text', 'required' => true, 'value' => $MCategory->getName()],
            ]
        ];
        if($request->getMethod() === Request::METHOD_POST) { // jalankan jika method POST
            .....
        }
        
        return $this->json($datas);
    }
}
sama seperti function insert, pada function update juga saya sertakan objek dari class Request sebagai parameter yang nanti berguna untuk mengambil nilai dari data yang dikirim menggunakan function POST. Kemudian kita coba untuk memanggil function update dengan method GET.

kemudian kita ubah function update menjadi seperti berikut :

<?php // src/Controller/ApiController.php

namespace App\Controller;

....

class ApiController extends AbstractController
{
    /**
     * @Route("/api", name="api")
     */
    public function index()
    {
        ....
    }
    
    /**
     * @Route("/api/insert", name="api_category_insert", methods={"GET","POST"})
     */
    public function insert(Request $request)
    {
        ....
    }
    
    /**
     * @Route("/api/update/{id}", name="api_category_update", methods={"GET","POST"})
     */
    public function update($id = null, Request $request)
    {
        if(is_null($id)){
            return $this->json(['status' => false, 'messages' => 'id tidak boleh kosong']);
        }
        
        // mengambil data berdasarkan id
        $repository = $this->getDoctrine()->getRepository(MCategory::class);
        $MCategory = $repository->find($id);
        if(!$MCategory) {
            return $this->json(['status' => false, 'messages' => 'object tidak ditemukan.']);
        }
        $datas = [
            'name' => 'category', 
            'fields' => [
                ['name' => 'code', 'type' => 'text', 'required' => true, 'value' => $MCategory->getCode()],
                ['name' => 'name', 'type' => 'text', 'required' => true, 'value' => $MCategory->getName()],
            ]
        ];
        if($request->getMethod() === Request::METHOD_POST) { // jalankan jika method POST
            $data = $request->get($datas['name']);
            // validasi data
            if(empty($data)) {
                $result = ['status' => false, 'messages' => 'format tidak valid.'];
                return $this->json($result);
            }
            foreach($datas['fields'] as $field) {
                if($field['required']) {
                    if(isset($data[$field['name']])) {
                        if(empty($data[$field['name']])) {
                            $result = ['status' => false, 'messages' => $field['name'].' is required.'];
                            return $this->json($result);
                        }
                    }
                }
            }
            
            // kita definisikan entity manager
            $entityManager = $this->getDoctrine()->getManager();
            // membuat object category dan set value
            if(isset($data['code'])){
                $MCategory->setCode($data['code']);
            }
            if(isset($data['name'])) {
                $MCategory->setName($data['name']);
            }
            // menyimpan object ke database
            $entityManager->persist($MCategory);
            $entityManager->flush();

            return $this->json(['status' => true, 'messages' => 'update data successfully.', 'id' => $MCategory->getId()]);
        }
        
        return $this->json($datas);
    }
}
dan kemudian kita coba kirim data menggunakan method POST :

sampai disini kita selesai membuat halaman edit data dan kita lanjut membuat halaman hapus / delete data.

Halaman Hapus Data

untuk membuat halaman hapus data, sekarang kita tambahkan function deleted yang disertai dengan parameter id seperti berikut : 

<?php // src/Controller/ApiController.php

namespace App\Controller;

....

class ApiController extends AbstractController
{
    /**
     * @Route("/api", name="api")
     */
    public function index()
    {
        ....
    }
    
    /**
     * @Route("/api/insert", name="api_category_insert", methods={"GET","POST"})
     */
    public function insert(Request $request)
    {
        ....
    }
    
    /**
     * @Route("/api/update/{id}", name="api_category_update", methods={"GET","POST"})
     */
    public function update($id = null, Request $request)
    {
        ....
    }
    
    /**
     * @Route("/api/delete/{id}", name="api_category_delete", methods={"DELETE"})
     */
    public function deleted($id = null)
    {
        if(is_null($id)){
            return $this->json(['status' => false, 'messages' => 'id tidak boleh kosong']);
        }
        $repository = $this->getDoctrine()->getRepository(MCategory::class);
        $MCategory = $repository->find($id);
        if(!$MCategory) {
            return $this->json(['status' => false, 'messages' => 'object tidak ditemukan.']);
        }
        
        // menghapus data 
        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->remove($MCategory);
        $entityManager->flush();
        return $this->json(['status' => true, 'messages' => 'data berhasil dihapus']);
    }
}
pada kode di atas, pertama kita cek apakah ada data dengan id seperti yang dikirim jika tidak ditemukan maka akan dikembalikan pesan dengan status false. Dan function di atas method yang diijinkan adalah DELETE, jadi jika method yang dipakai selain DELETE maka akan ditolak. Sekarag kita coba memanggilnya menggunakan POSTMAN :
jadi sekarang keseluruhan Controller kita menjadi seperti berikut :

<?php // src/Controller/ApiController.php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use App\Entity\MCategory;
use Symfony\Component\HttpFoundation\Request;

class ApiController extends AbstractController
{
    /**
     * @Route("/api", name="api")
     */
    public function index()
    {
        $repository = $this->getDoctrine()->getRepository(MCategory::class);
        $MCategorys = $repository->findAll();
        $datas = [];
        foreach($MCategorys as $MCategory) {
            $datas[] = [
                'id' => $MCategory->getId(),
                'code' => $MCategory->getCode(),
                'name' => $MCategory->getName()
            ];
        }
        return $this->json($datas);
    }
    
    /**
     * @Route("/api/insert", name="api_category_insert", methods={"GET","POST"})
     */
    public function insert(Request $request)
    {
        $datas = [
            'name' => 'category', 
            'fields' => [
                ['name' => 'code', 'type' => 'text', 'required' => true],
                ['name' => 'name', 'type' => 'text', 'required' => true],
                ]
            ];
        if($request->getMethod() === Request::METHOD_POST) { // jalankan jika method POST
            $data = $request->get($datas['name']);
            // validasi data
            if(empty($data)) {
                $result = ['status' => false, 'messages' => 'format tidak valid.'];
                return $this->json($result);
            }
            foreach($datas['fields'] as $field) {
                if($field['required']) {
                    if(!isset($data[$field['name']])) {
                        $result = ['status' => false, 'messages' => 'format tidak valid ('.$field['name'].' is required)'];
                        return $this->json($result);
                    }else{
                        if(empty($data[$field['name']])) {
                            $result = ['status' => false, 'messages' => $field['name'].' is required.'];
                            return $this->json($result);
                        }
                    }
                }
            }
            
            // kita definisikan entity manager
            $entityManager = $this->getDoctrine()->getManager();
            // membuat object category dan set value
            $MCategory = new MCategory();
            $MCategory->setCode($data['code']);
            $MCategory->setName($data['name']);
            // menyimpan object ke database
            $entityManager->persist($MCategory);
            $entityManager->flush();

            return $this->json(['status' => true, 'messages' => 'saved data successfully.', 'id' => $MCategory->getId()]);
        }
        
        return $this->json($datas);
    }
    
    /**
     * @Route("/api/update/{id}", name="api_category_update", methods={"GET","POST"})
     */
    public function update($id = null, Request $request)
    {
        if(is_null($id)){
            return $this->json(['status' => false, 'messages' => 'id tidak boleh kosong']);
        }
        $repository = $this->getDoctrine()->getRepository(MCategory::class);
        $MCategory = $repository->find($id);
        if(!$MCategory) {
            return $this->json(['status' => false, 'messages' => 'object tidak ditemukan.']);
        }
        $datas = [
            'name' => 'category', 
            'fields' => [
                ['name' => 'code', 'type' => 'text', 'required' => true, 'value' => $MCategory->getCode()],
                ['name' => 'name', 'type' => 'text', 'required' => true, 'value' => $MCategory->getName()],
            ]
        ];
        if($request->getMethod() === Request::METHOD_POST) { // jalankan jika method POST
            $data = $request->get($datas['name']);
            // validasi data
            if(empty($data)) {
                $result = ['status' => false, 'messages' => 'format tidak valid.'];
                return $this->json($result);
            }
            foreach($datas['fields'] as $field) {
                if($field['required']) {
                    if(isset($data[$field['name']])) {
                        if(empty($data[$field['name']])) {
                            $result = ['status' => false, 'messages' => $field['name'].' is required.'];
                            return $this->json($result);
                        }
                    }
                }
            }
            
            // kita definisikan entity manager
            $entityManager = $this->getDoctrine()->getManager();
            // membuat object category dan set value
            if(isset($data['code'])){
                $MCategory->setCode($data['code']);
            }
            if(isset($data['name'])) {
                $MCategory->setName($data['name']);
            }
            // menyimpan object ke database
            $entityManager->persist($MCategory);
            $entityManager->flush();

            return $this->json(['status' => true, 'messages' => 'update data successfully.', 'id' => $MCategory->getId()]);
        }
        
        return $this->json($datas);
    }
    
    /**
     * @Route("/api/delete/{id}", name="api_category_delete", methods={"DELETE"})
     */
    public function deleted($id = null)
    {
        if(is_null($id)){
            return $this->json(['status' => false, 'messages' => 'id tidak boleh kosong']);
        }
        $repository = $this->getDoctrine()->getRepository(MCategory::class);
        $MCategory = $repository->find($id);
        if(!$MCategory) {
            return $this->json(['status' => false, 'messages' => 'object tidak ditemukan.']);
        }
        
        // menghapus data 
        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->remove($MCategory);
        $entityManager->flush();
        return $this->json(['status' => true, 'messages' => 'data berhasil dihapus']);
    }
}

cukup sekian tulisan saya kali ini, semoga bermanfaat. Lain kesempatan saya sambung dengan membuat validasi pada Entity. Terima kasih

Update : Selanjutnya mengenai validasi bisa dilihat pada link berikut -> https://catatan-pemrograman.blogspot.com/2018/09/validasi-di-symfony-4.html

Komentar

  1. kelinci99
    Togel Online Terpercaya Dan Games Laiinnya Live Casino.
    HOT PROMO NEW MEMBER FREECHIPS 5ribu !!
    NEXT DEPOSIT 50ribu FREECHIPS 5RB !!
    Ada Bagi2 Freechips Untuk New Member + Bonus Depositnya Loh ,
    Yuk Daftarkan Sekarang Mumpung Ada Freechips Setiap Harinya
    segera daftar dan bermain ya selain Togel ad juga Games Online Betting lain nya ,
    yang bisa di mainkan dgn 1 userid saja .
    yukk daftar di www.kelinci99.casino

    BalasHapus

Posting Komentar

Postingan populer dari blog ini

Contoh Perhitungan Algoritma Perceptron

      Melanjutkan tulisan saya sebelumnya tentang algoritma perceptron,kali ini saya akan menulis tentang conto perhitungan manual algoritma perceptron. Untuk contoh kasusnya saya menggunakan data logika AND. Cekidot.... Algoritma      Data yang kita gunakan sebagai contoh adalah data logika AND sebagai berikut: x1 x2 target 0 0 0 0 1 0 1 0 0 1 1 1       tentukan bobot awal secara acak, saya pakai contoh w1 = 0,w2 =0, learning rate = 1, bias = 0,maksimal epoh = 10. Disini saya memakai fungsi aktivasi undak biner. Epoh ke 1 Data ke satu x = {0,0}, bobot w = {0,0},b=0,target = 0 y_in = (x1*w1)+(x2*w2)+b = (0*0)+(0*0)+0 = 0 y = sign(0) = 1 karena y != target maka hitung error dan update bobot  error = target - y = 0 - 1 = -1 w1_baru = w1_lama +(learning_rate*error*x1)                = 0 + (1*(-1)*0) = 0 w2_baru = w2_lama +(learning_rate*error*x2)                = 0+(1*(-1)*0) = 0

Pemrograman Berorientasi Object - Overloading dan Overriding

       Function atau method overloading dan override adalah fitur yang sangat mendasar dan berguna dari bahasa OOP manapun. Dalam tutorial ini kita akan membahas implementasi metode overloading dan override di php. Di sini pertama kita akan membahas dasar-dasar overloading dan override. Setelah eksplorasi dasar kita akan menerapkan overloading dan override di php. Sebelum melangkah lebih jauh, saya mengasumsikan bahwa Anda memiliki pengetahuan dasar tentang class dan pewarisan di php. Anda juga memiliki pemahaman tentang magic method di php. Magic method karena overloading di php bisa di implmentasikan dengan menggunakan magic method. Overriding        Arti dasar dari overriding di OOP sama dengan arti kata sebenarnya. Dalam arti kata sebenarnya dari overriding adalah menggantikan perilaku orang tua yang sama pada anak. Ini sama dengan override method di OOP. Dalam arti OOP, override adalah mengganti method class induk di class anak. Atau dengan method kata kunci sederhana yang me

Contoh Perhitungan Algoritma Learning Vector Quantization

Melanjutkan tulisan saya tentang algoritma Learning Vector Quantization yang lalu, kali ini saya akan melanjutkan dengan contoh perhitungan manual. Berikut ini contoh data yang akan kita hitung. No X1 X2 X3 X4 target 1 0 1 1 0 0 2 0 0 1 1 1 3 1 1 1 1 0 4 1 0 0 1 1 pada contoh di atas, saya menggunakan 4 data sebagai data training beserta target yang bertujuan untuk mendapatkan bobot yang akan digunakan pada proses klasifikasi. Bobot awal adalah { 1, 1, 1, 0} dan { 1, 0, 1, 1} dengan learning rate 0,05 dengan fungsi pembelajaran = 0,1. Pelatihan Iterasi ke 1 1. Data ke 1 { 0, 1, 1, 0} dengan target 0, bobot = {{ 1, 1, 1, 0},{ 1, 0, 1, 1}}      - menghitung bobot untuk masing masing output :          kelas 0 = sqrt(((0-1)^2)+((1-1)^2)+((1-1)^2)+((0-0)^2)) = 1         kelas 1 = sqrt(((0-1)^2)+((1-0)^2)+((1-