Selamat Datang di blog sederhana saya,Semoga apa yang Kalian Inginkan dapat terpenuhi disini.

keunggulan php 7


Keunggulan PHP 7

Ada berbagai keunggulan yang ditawarkan PHP 7.2 dibandingkan dengan versi sebelumnya. Dikutip dari  sumber php.net, ada beberapa fitur yang merupakan perbaikan dari versi sebelumnya seperti Scalar type declarations, Return type declarations, Anonymous classes, Generator Return Expressions dan sebagainya. Selain itu dikutip dari sumber  Dev.to, PHP 7.2 memiliki sistem security yang lebih baik karena sudah memasukkan Modern Cryptography di dalamnya. PHP 7.2 telah support Argon2 serta Libsodium untuk mengamankan password. Perlu diketahui bahwa Libsodium merupakan software library untuk enkripsi, dekripsi, signature serta password hashing.
Jika sebelumnya anda menggunakan php yang lama kemudian terjadi error dengan koneksi ke database anda bisa lakukan dengan contoh di bawah ini.
Contoh Untuk koneksi ke database dengan menggunakan php 7
Keunggulan PHP 7










Koneksi ke Database dengan Script PHP

<?php
//mendefenisikan nama server. dafault server lokal anda adalah 'localhost'
define("SERVER","localhost");

define("USER","root");
//mendefenisikan nama user pada database MySQL. dafault user server lokal adalah 'root'

define("PASS","");
//mendefenisikan password pada database MySQL. dafault pass server lokal adalah kosong.

$connect=mysqli_connect(SERVER, USER, PASS);
if (mysqli_connect_errno())
{
//Jika koneksi gagal, tampilkan pesan ini
echo "Koneksi Gagal: " . mysqli_connect_error();
}

//Jika koneksi sukses, tampilkan pesan ini
echo "Koneksi Sukses";
?>

Dikutip dari beberapa sumber
Share:

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
Share:

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
Share:
  • ()
  • ()
Show more

Halaman