Melakukan Filter pada Router Laravel Dengan Regular Expressions

Laravel

Kita 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


Artikel Terkait

;