Table of Contents

Penjelasan

Semua alamat halaman pada Laravel harus didefinisikan pada file penjaluran atau route yang terdapat pada folder routes. Semua file route akan secara otomatis dipanggil melalui App\Providers\RouteServiceProvider. Terdapat beberapa file pada folder routes misalnya file routes/web.php digunakan untuk medefinisikan penjaluran untuk antar muka web dimana penjaluran ini akan melalui kelompok web middleware yang diproteksi dengan session dan CSRF protection.

Secara umum pada saat mengembangkan aplikasi, kita akan mendefinisi routes/penjaluran pada file routes/web.php yang dapat diakses dengan memasukkan url pada web browser. Sebagai contoh pada saat kita membuat halaman dengan alamat http://example.com/user maka kita harus mendefinisikan alamat tersebut pada file routes/web.php sebagai berikut:

				
					<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\UserController;

Route::get('/user', [UserController::class, 'index']);
				
			
Metode Route yang Tersedia

Kita dapat mendaftarkan penjaluran pada route dengan beberapa metode seperti berikut :

				
					Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
				
			

Kita juga dapat mendaftarkan alamat route/jalur yang dapat diakses dengan mendaftarkan semua metode (get, post, put, dll) menggunakan match atau membuat route yang dapat diakses melalui semua alamat dan metode (get, post, put, delete, patch, dll) dengan menggunakan any

				
					Route::match(['get', 'post'], '/', function () {
//
});

Route::any('/', function () {
//
});
				
			
Dependency Injection

Kita dapat mengirimkan semua parameter/data yang disertakan pada saat mengakses aplikasi melalui route yang kita daftarkan untuk kemudian dapat dipanggil pada halaman yang dituju. Sebagai contoh misalnya kita akan menyertakan Illuminate\Http\Request class untuk menangkap HTTP request kemudian kita kirimkan ke halaman tertentu maka kita dapat melakukan dengan:

				
					use Illuminate\Http\Request;
 
Route::get('/users', function (Request $request) {
    // ...
});
				
			
CSRF Protection / Proteksi CSRF

Setiap form atau imputan yang menggunakan metode post, put, patch, dan delete yang didaftarkan pada route web harus menyertakan  CSRF token. Jika tidak maka inputan tersebut akan diabaikan untuk itu harus menyertakan @csrf diantaran tag form sebagai berikut:

				
					<form action="/profile" method="POST">
     @csrf 
     ... 
</form>
				
			
Redirect Routes

Untuk mengalihkan atau redirect kehalaman lain kita dapat menggunakan metode Route::redirect pada route. Metode ini akan memungkinkan programmer dapat membuat prosedur pengalihan dengan mudah dan simpel.

				
					Route::redirect('/alamatawal', '/alamattujuan');
				
			

Secara default prosedur redirect akan membawa status kode 302. Jika kita ingin mengubah status kode tersebut kita dapat menentukan melalui parameter ketiga.  

				
					Route::redirect('/here', '/there', 301);
				
			
View Routes

Jika halaman web kita hanya memerlukan view (tidak membutuhkan controller) maka kita dapat menggunakan metode Route::view. Kita juga dapat menyertakan parameter tertentu pada route tersebut untuk dikirim pada view. 

				
					Route::view('/welcome', 'welcome');
Route::view('/welcome', 'welcome', ['name' => 'Taylor']);
				
			

Penjaluran diatas mendifinisikan bahwa ketika kita mengakses url /welcome maka langsung diarahkan ke file views/welcome.blade.php tanpa perlu melalui controller terlebih dahulu.

Daftar Route

Untuk melihat daftar penjaluran atau route yang telah kita buat, kita dapat menggunakan perintah route:list pada php artisan.

				
					php artisan route:list
				
			

Kita juga dapat melihat middleware yang terkoneksi ke router kita dengan memberikan opsi -v

				
					php artisan route:list -v
				
			

Untuk melihat route apa saja yang tersedia yang dibuat oleh pihak ketiga, kita dapat menambahkan opsi –except-vendor atau –only-vendor jika hanya menampilkan penjaluran dari pihak ketiga

				
					php artisan route:list --except-vendor
				
			

atau

				
					php artisan route:list --only-vendor
				
			
Parameter Route
Required Parameters

Pada saat mengembangkan aplikasi web, terkadang kita perlu mengambil data pada bagian URI untuk digunakan pada controller atau lainnya. sebagai contoh misalnya kita ingin mengambil id berita pada URL, maka kita dapat menambahkan paramater pada saat penjaluran.

				
					Route::get('/artikel/{id}', function ($id) {
 return 'Id artikel:  '.$id;
});
				
			

Kita juga dapat membuat lebih dari satu parameter mengambil data pada URI.

				
					Route::get('/artikel/{id}/comment/{comment}', function ($id,$comment) {
 return 'Id artikel:  '.$id." comment:".$comment;
});
				
			

Penulisan parameter route harus menggunakan tanda kurung kurawal { } dan menggunakan karakter alfabet atau boleh juga menggunakan tanda garis bawah / underscore ( _ ).

Optional Parameters

Kita dapat menggunakan parameter optional pada route yang kita buat degan menambahkan tanda tanya ( ? ). Parameter ini memungkinkan kita mengatur nilai parameter sesuai dengan yang kita tentukan jika nilai parameter sebelumnya bernilai null atau kosong. 

				
					Route::get('/user/{name?}', function ($name = 'John') {
 return $name;
});
				
			
Filter Regular Expression

Dengan menggunakan metode where pada penjaluran kita dapat membatasi nilai dari parameter pada url yang dapat diinputkan. Pembatasan dilakukan dengan menuliskan nama parameter dan reguler expression.

				
					Route::get('/user/{name}', function ($name) {
    //
})->where('name', '[A-Za-z]+');
 
Route::get('/user/{id}', function ($id) {
    //
})->where('id', '[0-9]+');
 
Route::get('/user/{id}/{name}', function ($id, $name) {
    //
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
				
			

Untuk mempermudah melakukan pembatasan yang bersifat umum atau sering digunakan dapat menggunakan beberapa metode seperti :

				
					Route::get('/user/{id}/{name}', function ($id, $name) {
    //
})->whereNumber('id')->whereAlpha('name');
 
Route::get('/user/{name}', function ($name) {
    //
})->whereAlphaNumeric('name');
 
Route::get('/user/{id}', function ($id) {
    //
})->whereUuid('id');
 
Route::get('/category/{category}', function ($category) {
    //
})->whereIn('category', ['movie', 'song', 'painting']);
				
			

Dengan melakukan pembatasan maka jika pengguna memasukkan nilai yang tidak sesuai, maka pengguna akan diarahkan ke halaman 404 not found.

Memberikan Nama pada Route

Kita dapat memberikan nama pada route untuk kemudian dipanggil sebagai url untuk mempermudah pada saat membuat kode sebagai contoh :

				
					Route::get('/user/profile', function () {
    //
})->name('profile')
				
			

Selanjutnya kita dapat membuat url untuk mengarahkan pada route diatas sebagai berikut :

				
					<a href="{{route('profile')}}>Profile</a>
				
			

atau dapat membuat redirect atau pengalihan dengan route diatas sebagai berikut :

				
					return redirect()->route('profile');
				
			

Jika kita menambahkan paramater pada route yang kita buat, kita dapat menambahkan nilai dari parameter tertentu pada komentar kedua pada fungsi route. Nilai dari parameter akan secara otomatis dimasukkan pada posisi parameter di url.

				
					Route::get('/user/{id}/profile', function ($id) {
    //
})->name('profile');
 
$url = route('profile', ['id' => 1]);
				
			

Variabel $url diatas akan bernilai /user/1/profile. Dan jika kita menambahkan lebih dari satu data dalam bentuk array maka secara otomatis akan diubah menjadi url query string.

				
					Route::get('/user/{id}/profile', function ($id) {
    //
})->name('profile');
 
$url = route('profile', ['id' => 1, 'photos' => 'yes']);
 
// /user/1/profile?photos=yes
				
			
Route Groups

Route groups memungkinkan kita untuk membuat kelompok pada penjaluran dan menambahkan atribut tertentu seperti middleware. Dengan melakukan pengelompokan kita tidak perlu memberikan atribut satu persatu pada route yang memiliki atribut yang sama. Kita dapat mengelompokkan route berdasakan hal-hal sebagai berikut :

Middleware

Hal pertama yang dapat dilakukan yaitu mengelompokkan route berdasarkan middleware tertentu, biasanya ini digunakan untuk melakukan pembatasan berkenaan dengan hak akses. Misalnya kita ingin membuat sebuah route yang hanya bisa diakses ketika pengguna telah login sebagai admin. Untuk melakukan hal tersebut kita dapat menggunakan metode middleware sebelum mendefinisikan route yang akan kita buat.

				
					Route::middleware(['auth'])->group(function () {
    Route::get('/user/profile', function () {
        // 
    });
});
				
			
Controllers

Kita juga dapat mengelompokkan route berdasarkan controller tertentu apabila route menggunakan method/metode di dalam controller yang sama.

				
					use App\Http\Controllers\OrderController;
 
Route::controller(OrderController::class)->group(function () {
    Route::get('/orders/{id}', 'show');
    Route::post('/orders', 'store');
});
				
			
Subdomain Routing

Pengelompokan route selanjutnya yang dapat dilakukan yaitu mengelompokkan route berdasarkan subdomain untuk membatasi bahwa route terntentu hanya dapat diakses melalui subdomain yang kita daftarkan.

				
					Route::domain('{account}.example.com')->group(function () {
    Route::get('user/{id}', function ($account, $id) {
        //
    });
});
				
			
Route Prefixes

Pegelompokan route berdasakan prefik atau awalan pada url dapat dilakukan agar route yang kita buat lebih terstruktur. Misalnya kita ingin mengakses route dengan prefik admin, maka kita dapat mengunakan cara sebagai berikut:

				
					Route::prefix('admin')->group(function () {
    Route::get('/users', function () {
        // Matches The "/admin/users" URL
    });

    Route::get('/profile', function () {
        // Matches The "/admin/profile" URL
    });
});
				
			
Route Name Prefixes

Kita dapat memberikan nama route dengan mengelompokkan penamaan route tersebut berdasarkan prefix tertentu. Sebagai contoh misalnya kita ingin memberikan penamaan route yang diawali dengan admin. Pada proses pengelompokan seperti ini penamaan route akan diawali persis seperti karakter nama awalan yang diberikan, untuk memudahkan dalam mengorganisir sebaiknya prefix diberi akhiran titik (.).

				
					Route::name('admin.')->group(function () {
    Route::get('/users', function () {
        // Route akan memiliki nama "admin.users"...
    })->name('users');
});
				
			
Rate Limiting / Pembatasan Jumlah Kunjungan
Rate Limit

Framework laravel memiliki fitur untuk membatasi jumlah kunjungan dalam waktu tertentu yang dapat dengan mudah dikonfigurasi dan diterapkan pada route atau kelompok route tertentu. Untuk membatasi jumlah kunjungan pengguna kita dapat melakukannya pada metode configureRateLimiting yang terdapat pada kelas App\Providers\RouteServiceProvider.php

Pembatasan kunjungan ini ditangani oleh metode RateLimite facade’s dan konfigurasi pembatasan jumlah kunjungan menggunakan kelas Illuminate \Cache\RateLimiting\Limit sehingga kedua kelas tersebut harus dipanggil terlebih dahulu untuk memulai melakukan pembatasan. Adapun secara umum pembatasan jumlah kunjungan dapat dilakukan dengan mengedit file App\Providers\RouteServiceProvider.php sebagai berikut :

				
					use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
 
/**
 * Configure the rate limiters for the application.
 *
 * @return void
 */
protected function configureRateLimiting()
{
    RateLimiter::for('global', function (Request $request) {
        return Limit::perMinute(1000);
    });
}
				
			

Pada saat jumlah kunjungan telah melewati batas yang ditetapkan, maka secara otomatis pengunjung akan mendapatkan respon dengan status kode HTTP 429 pada saat membuka halaman lainnya. Kita juga dapat mendefinisikan status respon sendiri melalui metode response. 

				
					RateLimiter::for('global', function (Request $request) {
    return Limit::perMinute(1000)->response(function (Request $request, array $headers) {
        return response('Custom response...', 429, $headers);
    });
});
				
			

Pada saat jumlah kunjungan telah mencapai batas maksimum, maka pengunjung tidak lagi dapat mengakses website atau akan mendapatkan renspon kode 429. Namun untuk pengunjung tertentu, misalnya pengunjung vip, kita dapat memberikan pengecualian sehingga pengunjung tersebut masih tetap dapat mengakses website walaupun telah melewati limit. Pengecualian biasanya dilakukan berdasarkan autentifikasi.

				
					RateLimiter::for('uploads', function (Request $request) {
    return $request->user()->vipCustomer()
        ? Limit::none()
        : Limit::perMinute(100);
});
				
			
Segmenting Rate Limits

Adakalanya kita ingin memberikan batasan jumlah kunjungan berdasarkan atribut tertentu, misalnya kita ingin membatasi jumlah kunjungan pengguna 100 kali maksimal dalam kurun waktu satu menit berdasarkan alamat IP. Maka kita dapat melakukan pembatasan degan menggunakan method by sebagai berikut:

				
					RateLimiter::for('uploads', function (Request $request) {
    return $request->user()->vipCustomer()
        ? Limit::none()
        : Limit::perMinute(100)->by($request->ip());
});
				
			

Atau dalam contoh yang lain kita ingin memberikan batasan kunjungan 100 kali untuk pengguna terdaftar berdasarkann autentikasi ID dan 10 kali berdasarkan alamat IP untuk pengunjung tanpa login.

				
					RateLimiter::for('uploads', function (Request $request) {
    return $request->user()
        ? Limit::perMinute(100)->by($request->user()->id)
        : Limit::perMinute(10)->by($request->ip());
});
				
			
Rate Limit pada Route

Laravel juga menyediakan metode untuk melakukan batasan kunjungan melalui throttle middleware. 

				
					Route::middleware(['throttle:uploads'])->group(function () {
    Route::post('/audio', function () {
        //
    });
 
    Route::post('/video', function () {
        //
    });
});
				
			
Form Method Spoofing

HTML Form tidak mendukung penggunaan metode PUT, PATCH, dan DELETE sehingga pada saat membuat route PUT, PATCH, dan DELETE yang dipanggil dari form HTML kita harus membuat inputan hidden dengan nama _method  ke from HTML. Data yang dikirim melalui inputan _method akan digunakan sebagai metode HTTP request.

				
					<form action="/example" method="POST">
 <input type="hidden" name="_method" value="PUT">
 <input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>  
				
			

Atau kita juga dapat mendefinisikannya menggunakan blade template 

				
					<form action="/example" method="POST">
 @method('PUT')
 @csrf
</form>