Pada tutorial laravel kali ini kita akan belajar tentang cara membuat validasi pada form inputan dengan menggunakan laravel, misal kita akan membuat pengaturan bahwa form tertentu wajib diisi atau misalnya karakter yang dimasukkan harus lebih dari 5 karakter, maksimal karakter yang bisa diinput 15 karakter dan sebaginya.
Ada banyak sekali validasi yang bisa kita buat dengan laravel, dimana laravel telah menyediakan berbagai jenis validasi yang bisa kita gunakan.
Membuat Form Validasi pada Laravel
Secara default laravel telah menyediakan sebuah fungsi untuk membuat proses validasi form, yaitu dengan menggunakan fungsi validate().
Untuk mempelajari tutorial ini sebaiknya kita sudah membaca tutorial sebelumnya yaitu tentang Request Data Pada Laravel
Selanjutnya untuk latihan kita buat project baru atau melanjutnya project sebelumnya yang bernama latihan_laravel, pertama-tama kita buat 2 buah route untuk membuat form inputan dan route yang 1 laginya untuk membuat proses validasi dari form inputan yang dikirim.
latihan_laravel/routes/web.php
Route::get('/input', 'ValidasiController@input'); Route::post('/proses', 'ValidasiController@proses');
Di sini kita membuat 2 buah route, yaitu route get dengan url ‘input’ yang akan mengakses method input pada controller ValidasiController dan route yang satunya lagi kita buat route post dengan url ‘proses’ yang akan memproses method atau function proses pada controller ValidasiController, untuk nama controller dan method bebas-bebas saja silahkan sesuaikan dengan project masing-masing, jika belum memahami silahkan pelajari lagi tentang materi route dan controller.
Selanjutnya kita buat controller ‘ValidasiController’ sesuai dengan yang sudah kita buat pada route, untuk membuat controller pada laravel kita bisa membuatnya secara manual dalam folder App/Http/controllers atau membuat controller dengan php artisan melalui terminal/cmd dengan perintah :
php artisan make:controller ValidasiController
Setelah selesai membuat controller, sekarang kita buat 2 buah method sesuai dengan yang telah kita buat pada route sebelumnya yaitu method input dan method proses. Buka ValidasiController.php nya dan tulis syntax berikut :
latihan_laravel/app/Http/controllers/ValidasiController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class ValidasiController extends Controller { public function input() { return view('input'); } public function proses(Request $request) { $this->validate($request,[ 'nama' => 'required|min:5|max:20', 'pekerjaan' => 'required', 'usia' => 'required|numeric' ]); return view('proses',['data' => $request]); } }
Pada method input() kita membuat sebuah view yang menampilkan form penginputan, pada form tersebut akan kita arahkan prosesnya pada method proses() menggunakan method post, seperti yang telah kita definisikan pada route. Selanjutnya kita buat view baru dengan nama input.blade.php.
latihan_laravel/resources/views/input.blade.php
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Tutorial Laravel : Form Validasi Pada Laravel</title> <!-- bootstrap --> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css"> </head> <body> <div class="container"> <div class="row justify-content-center"> <div class="col-lg-6"> <div class="card mt-5"> <div class="card-body"> <h3 class="text-center">www.agussuratna.net</h3> <br/> {{-- menampilkan error validasi --}} @if (count($errors) > 0) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif <br/> <!-- form validasi --> <form action="/proses" method="post"> {{ csrf_field() }} <div class="form-group"> <label for="nama">Nama</label> <input class="form-control" type="text" name="nama" value="{{ old('nama') }}"> </div> <div class="form-group"> <label for="kelas">Kelas</label> <input class="form-control" type="text" name="kelas" value="{{ old('kelas') }}"> </div> <div class="form-group"> <label for="usia">Usia</label> <input class="form-control" type="text" name="usia" value="{{ old('usia') }}"> </div> <div class="form-group"> <input class="btn btn-primary" type="submit" value="Proses"> </div> </form> </div> </div> </div> </div> </div> </body> </html>
Pada form di atas kita mengarahkan ke route ‘/proses’ dengan method post, perhatikan pada valuenya masing-masing input, salah satunya ada fitur laravel yaitu fungsi old(). Fungsi ini berguna untuk menampilkan data yang sebelumnya diinput.
Jadi jika ada validasi error maka data yang diisi pada form tidak hilang, tapi tetap masih ditampilkan, hal ini untuk mengatasi ketidakefektifan jika user harus menginput data berulang-ulang jika ada validasi yang salah pada penginputan.
Selanjutnya perhatikan method proses() yang ada pada controller ValidasiController.php
public function proses(Request $request) { $this->validate($request,[ 'nama' => 'required|min:5|max:20', 'kelas' => 'required', 'usia' => 'required|numeric' ]); return view('proses',['data' => $request]); }
Pada method ini kita melakukan validasi form dengan fungsi validate(), pertama kita tangkap data-data yang dikirim ke method ini ke dalam variabel $request, kemudian kita isi variabel $request ini ke dalam parameter pertama fungsi validate(), kemudian kita buat pengaturan validasinya masing-masing.
$this->validate($request,[ 'nama' => 'required|min:5|max:20', 'kelas' => 'required', 'usia' => 'required|numeric' ]);
Pada contoh validasi laravel ini kita membuat pengaturan ‘required’ pada form nama, kelas dan usia, yang memvalidasi form nama, kelas dan usia wajib untuk di isi (tidak boleh kosong). Kemudian pada form nama, kita buat juga validasi jumlah minimal dan jumlah maksimal karakter yang diinput, di sini ditetapkan form nama minimal harus 5 karakter (min:5), dan maksimal 20 karakter (max:20). Jika validasi berhasil atau jika yang diinput sesuai dengan pengaturan yang sudah kita tetapkan dalam fungsi validate() tadi, maka kita passing data yang di input oleh user ke view proses.blade.php.
latihan_laravel/resources/proses.blade.php
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Tutorial Laravel : Form Validasi Pada Laravel</title> <!-- bootstrap --> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css"> </head> <body> <div class="container"> <div class="row justify-content-center"> <div class="col-lg-6"> <div class="card mt-5"> <div class="card-body"> <h3>www.agussuratna.net</h3> <h5 class="my-4">Data Yang Di Input : </h5> <table class="table table-bordered table-striped"> <tr> <td style="width:150px">Nama</td> <td>{{ $data->nama }}</td> </tr> <tr> <td>Kelas</td> <td>{{ $data->kelas }}</td> </tr> <tr> <td>Usia</td> <td>{{ $data->usia }}</td> </tr> </table> <a href="/input" class="btn btn-primary">Kembali</a> </div> </div> </div> </div> </div> </body> </html>
Pada view proses.blade.php ini kita tampilkan data-data yang dikirim dari method proses() tadi. Perhatikan lagi pada view input.blade.php, di sana kita membuat pengecekan jika ada error dari validasi formnya, maka kita tampilkan errornya secara keseluruhan dan berurut.
@if (count($errors) > 0) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif
Jika jumlah error lebih besar dari 0 yang artinya ada error, maka tampilkan semua error dengan menggunakan fungsi foreach().
Kita coba jalankan projectnya dengan perintah php artisan serve pada terminal/cmd dan akses localhost:8000/input, selanjutnya kita coba isi datanya dengan data yang kurang sesuai, misal mengisi nama dengan 4 karakter, yang seharusnya harus minimal 5 karakter, klik proses maka validasi dijalankan, error yang tampil sesuai dengan yang diinput dan sesuai dengan pengaturan validasi yang sudah kita buat pada fungsi validate(). termasuk jika ada form yang yang tidak diisi. Setelah diisi dengan data yang tidak sesuai kita isi juga dengan data yang sesuai.
Kita bisa menyesuaikan dengan kebutuhan, jika kita ingin mengolah data yang diinput misalnya menginput data ke database, kita bisa membuat fungsinya setelah fungsi validate() di controller ValidasiController.php.
public function proses(Request $request) { $this->validate($request,[ 'nama' => 'required|min:5|max:20', 'kelas' => 'required', 'usia' => 'required|numeric' ]); //buat proses yang kita inginkan di sini return view('proses',['data' => $request]); }
Mengubah Pesan Error Validasi Laravel
Pesan error yang tampil pada validasi laravel merupakan pesan default, untuk mengubah pesan yang tampil kita juga bisa custom pesan error tersebut. Caranya kita buat variabel dan isi array seperti contoh dibawah dan nama variabelnya isikan ke parameter ke tiga dalam fungsi validate(). Variabel tersebut ditulis sebelum fungsi validate() pada controller ValidasiController.php seperti contoh berikut :
latihan_laravel/app/Http/controllers/ValidasiController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class ValidasiController extends Controller { public function input() { return view('input'); } public function proses(Request $request) { $pesan = [ 'required' => ':attribute wajib diisi !', 'min' => ':attribute harus diisi minimal :min karakter !', 'max' => ':attribute harus diisi maksimal :max karakter !', 'numeric' => ':attribute harus diisi angka !', ]; $this->validate($request,[ 'nama' => 'required|min:5|max:20', 'kelas' => 'required', 'usia' => 'required|numeric' ],$pesan); return view('proses',['data' => $request]); } }
Pada contoh ini kita mengubah validasi required pesan errornya menjadi “nama_atributnya wajib diisi !” dan sebagainya, selanjutnya kita lihat hasilnya.
Jenis Validasi Form Pada Laravel
Berikut ini beberapa validasi yang paling sering dibutuhkan :
required | membuat form wajib isi |
min:10 | membuat minimal karakter yang diinput |
max:10 | membuat maksimal karakter yang boleh diinput |
alpha | hanya boleh menginput huruf |
numeric | hanya boleh menginput angka |
alpha_num | hanya boleh menginput angka dan huruf ( !@#$%%^&* dan lain-lain tidak diperbolehkan ) |
bail | berhenti menjalankan validasi selanjutnya jika validasi sebelumnya gagal (error) |
hanya boleh menginput email |
Untuk validasi yang lengkap yang akan kita buat kita bisa lihat di sini .
Catatatan :
Jika kita ingin membuat validasi password atau ingin data yang diisi pada 2 buah form sama, kita bisa menggunakan ‘confirmation’, misalnya ada 2 buah form yaitu form password dan form konfirmasi password, agar yang diisi pada form password sama dengan yang di isi pada form konfirmasi password, kita bisa menggunakan ‘password_confirmation’ pada validasi form konfirmasi password (sesuai dengan nama form sebelumnya). Contoh jika nama form password adalah nama, maka nama validation konfirmasinya ‘nama_confirmation‘.
Referensi :
- https://www.malasngoding.com/membuat-form-validasi-pada-laravel/