Langsung ke konten utama

Validasi di Symfony 4

Setelah sebelumnya saya sudah menulis tentang membuat CRUD API di Symfony, kali ini saya lanjutkan untuk menulis tentang membuat validasi di symfony. Tulisan ini adalah lanjutan dari tulisan saya sebelum sebelumnya tentang symfony 4. Untuk membaca tulisan saya sebelumnya tentang CRUD di Symfony, anda bisa buka di https://catatan-pemrograman.blogspot.com/2018/09/membuat-api-crud-di-symfony-4.html.

Pada tulsian saya sebelumnya, saat membuat fungsi untuk melakukan insert data maupun edit data, saya membuat array untuk melakukan validasi terhadap inputan yang masuk.
<?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()
    {
        ....
    }
    
    /**
     * @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);
                        }
                    }
                }
            }
            
            ......
        }
        
        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);
                        }
                    }
                }
            }
            
            .....
        }
        
        return $this->json($datas);
    }
    
    /**
     * @Route("/api/delete/{id}", name="api_category_delete", methods={"DELETE"})
     */
    public function deleted($id = null)
    {
        ....
    }
}
pada kode di atas, saya membuat array untuk melakukan validasi. Di Symfony, ada cara lain untuk melakukan validasi terhadap data yang di inputkan ke model dan yang selanjutnya disimpan ke tabel di database.

Membuat Validasi

untuk membuat validasi di symfony 4, kita perlu menambahkan dependency symfony/validator dan doctrine/annotations
composer require symfony/validator doctrine/annotations
jalankan perintah di atas di command line di folder project anda. Setelah selesai instalasi, selanjutnya kita buka entity MCategory di src/Entity/MCategory.php
<?php // src/Entity/MCategory.php

namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\MCategoryRepository")
 */
class MCategory
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $code;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $name;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\MNews", mappedBy="category")
     */
    private $mNews;

    public function __construct()
    {
        $this->mNews = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getCode(): ?string
    {
        return $this->code;
    }

    public function setCode(string $code): self
    {
        $this->code = $code;

        return $this;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }

    /**
     * @return Collection|MNews[]
     */
    public function getMNews(): Collection
    {
        return $this->mNews;
    }

    public function addMNews(MNews $mNews): self
    {
        if (!$this->mNews->contains($mNews)) {
            $this->mNews[] = $mNews;
            $mNews->setCategory($this);
        }

        return $this;
    }

    public function removeMNews(MNews $mNews): self
    {
        if ($this->mNews->contains($mNews)) {
            $this->mNews->removeElement($mNews);
            // set the owning side to null (unless already changed)
            if ($mNews->getCategory() === $this) {
                $mNews->setCategory(null);
            }
        }

        return $this;
    }
}
entity MCategory di atas mempunyai attribute id, code, dan name. Kemudian Sebagai contoh, attribute code dan name saya buat required atau wajib diisi. Nah untuk mengimplementasikannya, tambahkan Constraint di Entity MCategory seperti berikut:
use Symfony\Component\Validator\Constraints as Assert;
setelah itu, tambahkan juga di masing masing attribute seperti berikut:
/**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     * @Assert\NotBlank() // tambahkan kode berikut
     */
    private $code;

    /**
     * @ORM\Column(type="string", length=255)
     * @Assert\NotBlank() // tambahkan kode berikut
     */
    private $name;
sehingga keseluruhan entity menjadi seperti ini:
<?php // src/Entity/MCategory.php

namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Entity(repositoryClass="App\Repository\MCategoryRepository")
 */
class MCategory
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     * @Assert\NotBlank() // tambahkan kode berikut
     */
    private $code;

    /**
     * @ORM\Column(type="string", length=255)
     * @Assert\NotBlank() // tambahkan kode berikut
     */
    private $name;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\MNews", mappedBy="category")
     */
    private $mNews;

    public function __construct()
    {
        $this->mNews = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getCode(): ?string
    {
        return $this->code;
    }

    public function setCode(string $code): self
    {
        $this->code = $code;

        return $this;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }

    /**
     * @return Collection|MNews[]
     */
    public function getMNews(): Collection
    {
        return $this->mNews;
    }

    public function addMNews(MNews $mNews): self
    {
        if (!$this->mNews->contains($mNews)) {
            $this->mNews[] = $mNews;
            $mNews->setCategory($this);
        }

        return $this;
    }

    public function removeMNews(MNews $mNews): self
    {
        if ($this->mNews->contains($mNews)) {
            $this->mNews->removeElement($mNews);
            // set the owning side to null (unless already changed)
            if ($mNews->getCategory() === $this) {
                $mNews->setCategory(null);
            }
        }

        return $this;
    }
}
setelah itu ubah Controller ApiController dan tambahkan beberapa kode berikut: - tambahkan kode berikut di header controller :

use Symfony\Component\Validator\Validator\ValidatorInterface;
- ubah function insert() dan update menjadi seperti berikut :
/**
     * @Route("/api/insert", name="api_category_insert", methods={"GET","POST"})
     */
    public function insert(Request $request, ValidatorInterface $validator)
    {
        $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);
            }
            
            // 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']);
            // validate
            $errors = $validator->validate($MCategory); // melakukan validasi terhadap data yang di inputkan ke entity
            if(count($errors)>0){ // jalankan jika ada error
                $error = [];
                foreach($errors as $k => $v){
                    $error[$v->getPropertyPath()] = $v->getMessage();
                }
                return $this->json(['errors' => $error]); // kembalikan data error
            }
            // 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);
            }
            
            // 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']);
            }
            // validate
            $errors = $validator->validate($MCategory); // melakukan validasi terhadap data yang di inputkan ke entity
            if(count($errors)>0){ // jalankan jika ada error
                $error = [];
                foreach($errors as $k => $v){
                    $error[$v->getPropertyPath()] = $v->getMessage();
                }
                return $this->json(['errors' => $error]); // kembalikan data error
            }
            // 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);
    }
sehingga keseluruhan controller 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;
use Symfony\Component\Validator\Validator\ValidatorInterface;

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, ValidatorInterface $validator)
    {
        $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);
            }
            
            // 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']);
            // validate
            $errors = $validator->validate($MCategory); // melakukan validasi terhadap data yang di inputkan ke entity
            if(count($errors)>0){ // jalankan jika ada error
                $error = [];
                foreach($errors as $k => $v){
                    $error[$v->getPropertyPath()] = $v->getMessage();
                }
                return $this->json(['errors' => $error]); // kembalikan data error
            }
            // 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);
            }
            
            // 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']);
            }
            // validate
            $errors = $validator->validate($MCategory); // melakukan validasi terhadap data yang di inputkan ke entity
            if(count($errors)>0){ // jalankan jika ada error
                $error = [];
                foreach($errors as $k => $v){
                    $error[$v->getPropertyPath()] = $v->getMessage();
                }
                return $this->json(['errors' => $error]); // kembalikan data error
            }
            // 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']);
    }
}
kemudian apabila saya coba POST data dengan nilai kosong /null akan muncul pesan seperti berikut:
bagaimana ? mudah bukan ? untuk merubah pesan error yang muncul cukup ubah Entity dibagian @Assert menjadi seperti berikut:
@Assert\NotBlank(message="wajib diisi")
untuk tipe Validasi lainnya, bisa dibaca pada link berikut : Validation Constraints Reference

Cukup sekian tulisan saya kali ini, semoga bermanfaat. Untuk tulisan saya selanjutnya tentang symfony (REST API dengan FOS REST Bundle) bisa di baca di https://catatan-pemrograman.blogspot.com/2018/10/membuat-api-crud-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-