Melakukan Filter pada Router Laravel Dengan Regular Expressions
LaravelKita dapat menuliskan seperti ini "Route::get(‘projects/{project_id}’, ‘ProjectController@show’);", tapi gimana kalau kita ingin nilai dari "project_id" hanya angka?
Untuk melakukannya, kalian dapat meletakkan kondisi where() pada pernyataan Route apa pun, dan menggunakan "Regular Expressions" untuk menentukan pola data.
Kalian bisa mempelajari dari dokumentasi resmi Laravel disini.
// Hanya abjad
Route::get('user/{name}', function ($name) {
//
})->where('name', '[A-Za-z]+');
// Hanya angka
Route::get('user/{id}', function ($id) {
//
})->where('id', '[0-9]+');
// Beberapa kondisi pada parameter
Route::get('user/{id}/{name}', function ($id, $name) {
//
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
Contoh lain akan membatasi beberapa parameter menjadi salah satu dari beberapa nilai yang ketat, lalu kita hindari pengecekan di controller:
Route::get('/user/{user_id}/{approve_action}','UserController@approve')
->where('approve_action', 'approve|decline');
Jika kalian menggunakan kondisi ini, maka route hanya akan cocok dengan yang ada dalam ekspresi reguler, jadi jika kalian memasukkan URL "/user/123" akan menampilkan halaman 404.
Kalian juga dapat menentukan bahwa beberapa nama variabel akan selalu mengikuti pola tertentu. Seperti, kalau ingin project_id di semua route bernilai integer. Maka kalian dapat melakukan ini di app/Providers/RouteServiceProvider.php:
public function boot()
{
Route::pattern('project_id', '[0-9]+');
parent::boot();
}
Semoga bermanfaat