Web Developer
Pertemuan 01
Aksamedia Team
17 Oktober 2018
Daftar Isi
Daftar Isi 1
Routing 5
Routing Dasar 5
Lokasi File Route 5
Method-Method Yang Tersedia 5
Route Redirect 6
Route View 6
Route Parameters 7
Parameter Wajib 7
Parameter Tidak Wajib 8
Parameter Berupa Regex 8
Memberi Nama Route 9
Generate URL dan Redirect 9
Route Groups 10
Middleware 10
Namespaces 10
Sub-Domain Routing 11
Route Prefixes 11
Route Name Prefixes 12
Rate Limiting 12
Method Spoofing 13
Mengakses Route yang Aktif 14
Melihat Daftar Route dari Aplikasi 14
1
Kesimpulan 15
2
Perhentian Pertama
Entri poin pertama dari setiap request ke dalam aplikasi laravel ada di file
public/index.php. Semua request, meskipun tidak mengarah ke url index.php tetap akan
di-redirect ke file public/index.php oleh web server (Nginx / Apache). Dalam file ini isinya tidak
terlalu banyak, tapi dari sinilah seluruh file dari framework akan dimulai, salah satunya adalah
me-retrieve i nstance app dari aplikasi laravel dari file bootstrap/app.php.
Pemberhentian selanjutnya adalah Kernel. Terdapat dua buah kernel pada Laravel.
Yaitu kernel untuk HTTP dan kernel untuk Console. Kernel untuk HTTP ada di file
app/Http/Kernel.php dan kernel untuk Console ada di file app/Console/Kernel.php. Jika pada
sistem operasi, kernel adalah bagian yang berperan sangat penting sehingga termasuk yang
awal-awal dieksekusi ketika booting, maka demikian juga dengan framework laravel. Kernel
pada laravel digunakan untuk menyiapkan segala hal yang dibutuhkan sebelum request
benar-benar ditangani. Semisal menyiapkan error handling, konfigurasi logging, mendeteksi
environment dari aplikasi dan tugas-tugas penting lainnya.
Service Provider
Service provider adalah yang bertanggung jawab untuk memuat dan memulai
komponen-komponen terpenting dari framework, seperti database, queue, validation, dan
routing.
3
Setelah keseluruhan service dari aplikasi berhasil di-load, maka Request dari user
akan mulai ditangani. Pertama-tama request akan dilewatkan ke dalam sistem routing untuk
ana request tersebut akan diproses.
kemudian dari situ akan ditentukan di controller m
Sebelum itu juga request akan melewati sebelum dan sesudah diproses oleh controller.
https://www.toptal.com/php/choosing-between-symfony-and-laravel-frameworks
Gambar perbandingan life cycle framework symfony dan laravel, kita fokus ke yang
laravel di mana di sana terlihat secara garis besar bagaimana request masuk ke dalam
framework laravel hingga keluar. Pembahasan tentang middleware dan controller secara
mendalam insyaallah akan dipelajari pada pertemuan-pertemuan yang akan datang.
4
Routing
Routing Dasar
Routing paling dasar pada laravel hanyalah kombinasi dari 2 parameter yaitu url dan
callback berupa Closure, atau fungsi tanpa nama atau juga sering disebut sebagai
anonymous function.
Route::get('/hello-world', function () {
return 'Hello world!';
});
JIka kita membuka alamat /hello-world maka kita akan melihat output berupa tulisan
“Hello world!”.
Route::get('/users', 'UserController@index');
Lokasi file route terdapat pada folder routes. Ada 4 file default dalam direktori
tersebut. 2 dari 4 file tersebut (yaitu routes/web.php dan routes/api.php) telah teregister atau
terload secara default oleh framework pada file app/Providers/RouteServiceProvider.php. Jika
kita buka file lalu kita lihat dua fungsi mapWebRoutes() dan mapApiRoutes() kita akan dapati
bahwa dua routing web dan api di-load dengan middleware yang berbeda.
Dalam routing laravel, kita bisa mendefinisikan semua method HTTP yang tersedia:
Route::get($uri, $callback);
5
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
Atau, dalam keadaan tertentu mungkin kita membutuhkan lebih dari satu HTTP
method untuk satu routing, maka kita bisa menggunakan fungsi match() dengan parameter
array. Dan apabila kita ingin satu routing bisa menangani semua HTTP method maka kita bisa
menggunakan fungsi any() sebagaimana contoh berikut.
Route::match(['get', 'post'], '/', function () {
// ini
});
Route::any('foo', function () {
//
});
Route Redirect
Untuk melakukan redirect kita bisa menggunakan fungsi redirect(). Fungsi ini
menerima 2 parameter wajib, dan 1 parameter optional. 2 parameter yang wajib adalah url
awal dan url tujuan. Sedangkan parameter ke-3 adalah integer berupa HTTP status code yang
ingin direturn, misalnya status code 302 yang menunjukkan bahwa redirect ini bersifat
sementara.
Route::redirect('/dari-sini', '/kesana', 302);
Route View
Jika pada suatu routing kita hanya ingin mengembalikan sebuah view maka kita
tinggal menggunakan fungsi view(). Fungsi view() menerima url sebagai parameter pertama,
dan nama atau lokasi file view sebagai parameter kedua. Sebagai tambahan, kita bisa
6
menambahkan data berupa array sebagai parameter ketiga di mana ini nantinya akan
diterima oleh view sebagai variabel.
Route::view('/welcome', 'welcome');
Route Parameters
Route bisa menerima parameter dinamis. Seperti username, id, dan sebagainya. Ada 3
jenis parameter yang tersedia pada framework laravel yaitu parameter yang wajib, parameter
tidak wajib, dan parameter berupa regex.
Parameter Wajib
Parameter wajib adalah parameter yang harus diisi. Jika tidak diisi maka framework
laravel akan mengembalikan response 404. Kita bisa mendefinisikan route parameter wajib
seperti berikut:
Route::get('user/{id}', function ($id) {
return "User {$id}";
});
Kita juga bisa mendefinisikan sebanyak mungkin parameter yang kita inginkan.
Route::get('user/{id}/photos/{photo}', function ($user, $photo) {
//
});
Nama variabel pada Closure tidak harus sama seperti pada pendefinisian parameter.
Kita bisa menggunakan nama variabel yang berbeda, yang penting adalah urutannya (selama
tidak ada dependency injection).
Route::get('user/{id}/photos/{photo}', function ($userId, $photoId) {
//
});
7
Kita juga bisa mendefinisikan parameter opsional, yang artinya tidak wajib untuk diisi.
Tetapi kita harus mendefinisikan nilai default dari parameter tersebut. Parameter yang tidak
wajib didefinisikan dengan diakhiri tanda tanya (?).
Route::get('blog/posts/{page?}', function ($page = null) {
return $page;
});
# atau
Route::get('blog/posts/{page?}', function ($page = 1) {
return $page;
});
Route::get('user/{name}', function ($name) {
//
})->where('name', '[A-Za-z]+');
8
Route::get('user/profile', function () {
//
})->name('user.profile');
# atau
Route::get('user/profile', 'UserController@show')->name('user.profile');
Dengan memberi nama route, kita bisa men-generate url dan redirect dengan cara
yang mudah tanpa harus menulis alamat lengkap dari routing tersebut. Seperti di bawah ini:
# Generating URLs...
$url = route('user.profile');
# Generating Redirects...
return redirect()->route('user.profile');
Ada pun jika pada routing terdapat parameter, kita bisa mengatur parameternya
dengan dengan mem-passing array pada fungsi route atau redirect.
Route::get('user/{id}/profile', function ($id) {
//
})->name('user.profile');
9
Route Groups
Penggunaan route group memungkinkan kita untuk mengatur properti tertentu
terhadap sekumpulan route tanpa harus mendefinisikannya satu-persatu. Semisal
middleware, url prefix, nama prefix, namespace dan sebagainya. Route group didefinisikan
dengan perintah Route::group.
Middleware
Untuk menentukan middleware terhadap route group kita harus memanggil fungsi
middleware() terlebih dahulu sebelum fungsi group(). Parameter yang diterima fungsi
middleware adalah array yang berisi nama middleware. Pembahasan tentang middleware
insyaallah akan dilakukan pada pertemuan-pertemuan yang akan datang
Route::middleware(['first', 'second'])->group(function () {
Route::get('/', function () {
// menggunakan middleware first dan second
});
Route::get('user/profile', function () {
// menggunakan middleware first dan second
});
});
Namespaces
Kasus lain yang sering memanfaatkan route group adalah ketika kita ingin
mendefinisikan namespace. Misalnya kita memiliki banyak controller pada directory
App\Http\Controllers\Admin. Maka kita bisa menambahkan namespace Admin pada route
group.
Route::namespace('Admin')->group(function () {
// Controllers Within The "App\Http\Controllers\Admin" Namespace
});
10
Sub-Domain Routing
Route::domain('{account}.myapp.com')->group(function () {
Route::get('user/{id}', function ($account, $id) {
//
});
});
Route Prefixes
Route prefix adalah salah satu kasus yang paling banyak digunakan pada
pendefinisian route group. Perhatikan contoh berikut:
Route::get('admin/users', 'UserController@index');
Route::post('admin/users', 'UserController@store');
Route::get('admin/users/{user}', 'UserController@show');
Route::get('admin/users/{user}/edit', 'UserController@edit');
Route::put('admin/users/{user}', 'UserController@update');
Route::delete('admin/users/{user}', 'UserController@destroy');
Dari pada mendefinisikan url admin pada setiap route, lebih baik kita menjadikannya
prefix dalam satu route group dengan memanggil fungsi prefix() sebelum fungsi group().
Route::prefix('admin')->group(function () {
Route::get('users', 'UserController@index');
Route::post('users', 'UserController@store');
Route::get('users/{user}', 'UserController@show');
Route::get('users/{user}/edit', 'UserController@edit');
Route::put('users/{user}', 'UserController@update');
Route::delete('users/{user}', 'UserController@destroy');
});
11
Lagi pula kalau kita misalkan ingin mengubah url prefix yang awalnya dari admin
menjadi misalkan super-admin, kita tinggal mengubah satu baris saja bukan? Ini jauh lebih
mudah dan menghemat tenaga.
Untuk prefix nama, kurang lebih seperti pada prefix url di penjelasan sebelumnya. Dan
prefix nama itu akan diatur/ditambahkan persis sebagaimana ia didefinisikan. Jadi perlu
diperhatikan untuk menambahkan tanda titik (.) pada pendefinisian nama.
Route::name('admin.')->group(function () {
Route::get('users', function () {
// Route assigned name "admin.users"...
})->name('users');
});
Rate Limiting
Laravel secara default sudah menyediakan middleware untuk membatasi akses pada
suatu route tertentu. Kita bisa menambahkan middleware tersebut kepada salah satu route
secara khusus atau juga kepada route group. Nama middleware-nya adalah throttle, ia
menerima 2 parameter, yang pertama adalah jumlah request maksimal dan parameter kedua
adalah rentang waktu dalam satuan menit.
Route::middleware('throttle:3,1')->group(function () {
Route::get('/tes-throttle', function () {
return "hello! anda hanya bisa melihat route ini 3 kali dalam satu menit";
});
});
Jika telah melakukan akses lebih dari batas yang ditentukan, otomatis framework
laravel akan mengembalikan response dengan http code 429. Jika request-nya bukan ajax,
tampilan error bawaannya adalah seperti pada gambar berikut:
12
Ini akan sangat berguna untuk keamanan aplikasi yang kita bangun. Terutama untuk
menangani serangan bruteforce atau untuk menangani bot request palsu. Sangat mudah
bukan?
Method Spoofing
Tidak semua HTTP method disupport oleh HTML, seperti method PUT, PATCH, dan
DELETE. Sehingga ketika kita mendefinsikan 3 HTTP method tersebut melalui form HTML
(bukan lewat ajax, kalau ajax support semua) kita perlu untuk melakukan teknik yang disebut
sebagai method spoofing. Yaitu method pada form tetap method POST akan tetapi kita
tambahkan satu field bernama _method dengan value PUT atau PATCH atau DELETE sesuai
dengan HTTP method yang dibutuhkan
<form action="/foo/bar" method="POST">
<input type="hidden" name="_method" value="PUT">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>
<form action="/foo/bar" method="POST">
@method('PUT')
@csrf
</form>
13
$route = Route::current();
$name = Route::currentRouteName();
$action = Route::currentRouteAction();
URL Generation
Laravel menyediakan helper-helper untuk memudahkan kita untuk men-generate URL.
Ini sangat membantu developer ketika membangun kumpulan link-link pada view atau pun
ketika melakukan redirect dari satu route ke route lainnya.
Penggunaan Dasar
$username = "aksamedia";
14
Dengan helper url() kita juga bisa men-generate url dengan query string. Caranya
sosiatif sebagai parameter kedua dari helper url().
adalah dengan menambahkan array a
{{ url('users', ['query' => 'aksamedia']) }}
Catatan: jika parameter pertama ada http/https maka host yang direturn adalah host
apa adanya, bukan host dari aplikasi kita. Contoh: url(‘http://tes.com’) akan menghasilkan
http://tes.com.
JIka helper url() dipanggil tanpa ada parameter, maka yang dikembalikan adalah
instance dari kelas Illuminate\Routing\UrlGenerator. Instance tersebut memungkinkan kita
untuk mengakses informasi tentang URL saat ini yang sedang aktif.
<div>
{{-- Mendapatkan url sekarang tanpa query string --}}
{{ url()->current() }} <br>
Helper url juga bisa diakses dengan URL facade sebagai berikut:
{{ \URL::current() }}
15
Route::get('/post/{post}', function () {
//
})->name('post.show');
echo route('post.show', ['post' => 1]);
Signed URL
{{ url()->signedRoute('confirmation', ['email' =>
‘developer.aksamedia@gmail.com’]) }}
http://localhost:8000/confirmation?email=developer.aksamedia@gmail.com&signature=bbfe
dd532db6aa5ea5e61893ea7a05e682e8605be82aeff2302238cef2727738
Url di atas jika kita mengganti query string emailnya, maka hasilnya akan tidak valid
ketika diperiksa tanda tangan digitalnya.
16
use Illuminate\Http\Request;
# proses confirmation
})->name('confirmation');
$url = action('HomeController@index');
use App\Http\Controllers\HomeController;
Kesimpulan
Laravel menyediakan berbagai macam fitur terkait dengan routing yang memudahkan
kita sebagai developer. Sehingga pengerjaan project pun bisa relatif menjadi jauh lebih cepat.
17
18