Halo teman-teman, kepiye kabare? semoga selalu sehat-sehat saja ya. Tetap jaga jarak supaya terhindar dari virus covid. Saya ucapkan selamat melaksanakan ibadah puasa bagi teman-teman yang melaksanakan.
Kali ini saya ingin menulis tentang bagaimana cara membuat custome validasi di laravel. Skenarionya, saya ingin memvalidasi inputan email apakah email tersebut terdaftar atau tidak. Untuk mengecek email tersebut, kita membutuhkan bantuan pihak ketiga, https://www.validator.pizza/. Validator Pizza adalah api untuk mengecek apakah sebuah domain, atau email terdaftar.
Selanjutanya kita juga membutuhkan package guzzlhttp, http client untuk melakukan request.
Langsung saja kita install :
composer require guzzlehttp/guzzle
Kemudian, jalankan perintah membuat rule validasi :
php artisan
php artisan make:rule MailValidation
Kemudian akan tercipta file di directory app\Rules\MailValidation.php :
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class MailValidation implements Rule
{
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return 'The :attribute must be required.';
}
}
Secara default file validator memiliki dua method. Method passes berfungsi sebagai penerima value dari inputan user, method ini berisi logika untuk menentukan apakah value dari inputan dilewatkan atau digagalkan. Method ini memiliki nilai kembalian boolean true atau false. Jika statusnya true, data akan dilewatkan dan diizin untuk melakukan proses selanjutnya. Sedangkan jika false, validator akan menjalankan method message. Method message adalah method yang mengembalikan pesan jika passes mengembalikan nilai false.
Selanjutnya di file MailValidation.php, tambah method baru sebagai wrapper/pembungkus proses request api ke validator pizza.
/**
* wrapper/pembungkus request ke validator.pizza
*
* @return bool
*/
public function validateMail($email)
{
$req = (new Client()) >get('https://www.validator.pizza/email/'. $email);
$body = json_decode($req->getBody()->getContents());
switch ($body) {
case $body->status == 400:
return false;
case !$body->mx:
return false;
case $body->disposable:
return false;
default:
return true;
}
}
Method diatas akan melakukan request, kemudian akan mengembalikan response.
Selanjutnya, karena validator pizza membatasi request hanya 120 request dalam satu jam, maka selebihnya kita akan anggap email tersebut valid. Untuk itu kita akan membuat method baru lagi yang berfungsi untuk mengkounter jumlah request, kita akan menyimpan data kounternya di dalam cache saja.
/**
* Get the validation error message.
*
* @return string
*/
public function limitRequest()
{
$range = Carbon::now()->addMinutes(60);
Cache::put('remaining_requests',
Cache::increment('remaining_requests', 1),
$range);
return Cache::get('remaining_requests');
}
Jangan lupa panggil package Carbon, dan Cache dibagian atas :
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;
use GuzzleHttp\Psr7\Request as GuzzleHttpRequest;
use Illuminate\Support\Facades\Cache;
use Carbon\Carbon;
Jika sudah, lengkapi methode passes menjadi seperti berikut :
public function passes($attribute, $value)
{
if ( ! filter_var($value, FILTER_VALIDATE_EMAIL)) {
return false;
}
if ($this->limitRequest() >= 120) {
return true;
}
if (ValidateMail() !== true) {
return false;
}
return true;
}
Method diatas akan mengecek apakah request sama dengan, atau lebih dari besar dari 120, jika ia maka tidak perlu melakukan request ke validator email, langsung dianggap true.
Code full dari MailValidation.php :
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ClientException;
use GuzzleHttp\Psr7\Request as GuzzleHttpRequest;
use Illuminate\Support\Facades\Cache;
use Carbon\Carbon;
class MailValidation implements Rule
{
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
if ( ! filter_var($value, FILTER_VALIDATE_EMAIL)) {
return false;
}
if ($this->limitRequest() >= 120) {
return true;
}
if (ValidateMail() !== true) {
return false;
}
return true;
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return 'The :attribute tidak valid';
}
/**
* wrapper/pembungkus request ke validator.pizza
*
* @return bool
*/
public function validateMail($email)
{
$req = (new Client()) >get('https://www.validator.pizza/email/'. $email);
$body = json_decode($req->getBody()->getContents());
switch ($body) {
case $body->status == 400:
return false;
case !$body->mx:
return false;
case $body->disposable:
return false;
default:
return true;
}
}
/**
* Get the validation error message.
*
* @return string
*/
public function limitRequest()
{
$range = Carbon::now()->addMinutes(60);
Cache::put('remaining_requests',
Cache::increment('remaining_requests', 1),
$range);
return Cache::get('remaining_requests');
}
}
Okey, untuk script MailValidation.php telah selesai. sekarang kita akan menggunakan rule validasi tersebut. Caranya kita bisa mengextend ke validator laravel, melalui AppServiceProvider.php di method boot(), seperti berikut :
public function boot()
{
Validator::extend('is_mail', 'MailValidation@passes');
}
Lalu di controller gunakan rule yang barus saja kita buat dengan cara :
$request->validate([
'email' => 'required|string|is_mail',
]);
Atau bisa juga dengan cara biasa seperti ini :
App\Rules\MailValidation
$request->validate([
'email' => ['required', 'string', new MailValidation()],
]);
Okey sekian dulu tulisan kali ini, semoga bermanfaat. Nantikan tulisan tentang laravel lainnya disini.
Yogyakarta, 24 April 2020 ditulis disaat bulan puasa, saat virus corona melanda.