Menguasai Rute Laravel
Diterbitkan: 2022-12-12Ketika datang ke backend, pengembang akhirnya menemukan rute. Rute dapat dianggap sebagai tulang punggung backend karena setiap permintaan yang diterima server dialihkan ke pengontrol melalui daftar perutean yang memetakan permintaan ke pengontrol atau tindakan.
Laravel menyembunyikan banyak detail implementasi untuk kita dan hadir dengan banyak sintaksis untuk membantu pengembang baru dan berpengalaman mengembangkan aplikasi web mereka.
Mari kita lihat lebih dekat bagaimana mengelola rute di Laravel.
Backend Routing dan Cross-Site Scripting di Laravel
Di server, ada rute publik dan pribadi. Rute publik dapat menjadi penyebab kekhawatiran karena kemungkinan cross-site scripting (XSS), sejenis serangan injeksi yang dapat membuat Anda dan pengguna Anda rentan terhadap pelaku jahat.
Masalahnya adalah bahwa pengguna dapat dialihkan dari rute yang tidak memerlukan token sesi ke rute yang membutuhkan — dan mereka masih memiliki akses tanpa token.
Cara termudah untuk mengatasi masalah ini adalah dengan menerapkan header HTTP baru, menambahkan "perujuk" ke rute untuk memitigasi skenario ini:
'main' => [ 'path' => '/main', 'referrer' => 'required,refresh-empty', 'target' => Controller\DashboardController::class . '::mainAction' ]
Perutean Dasar Laravel
Di Laravel, rute memungkinkan pengguna untuk merutekan permintaan yang sesuai ke pengontrol yang diinginkan. Rute Laravel paling dasar menerima Pengidentifikasi Aset Seragam (jalur rute Anda) dan penutupan yang dapat berupa fungsi atau kelas.
Di Laravel, rute dibuat di dalam file web.php dan api.php . Laravel hadir dengan dua rute secara default: satu untuk WEB dan satu lagi untuk API.
Rute-rute ini berada di folder routes/ , tetapi dimuat di Providers/RouteServiceProvider.php .
Alih-alih melakukan ini, kita dapat memuat rute langsung di dalam RouteServiceProvider.php , melewatkan folder routes/ sama sekali.
Pengalihan
Saat kami menentukan rute, biasanya kami ingin mengarahkan ulang pengguna yang mengaksesnya, dan alasannya sangat bervariasi. Mungkin karena ini adalah rute yang sudah tidak digunakan lagi dan kami telah mengubah backend atau server, atau mungkin karena kami ingin memasang autentikasi dua faktor (2FA), dan seterusnya.
Laravel memiliki cara mudah untuk melakukan ini. Berkat kesederhanaan framework, kita dapat menggunakan metode redirect pada Route fasad, yang menerima rute masuk dan rute yang akan diarahkan.
Opsional, kami dapat memberikan kode status untuk pengalihan sebagai parameter ketiga. Metode permanentRedirect
akan melakukan hal yang sama seperti metode redirect
, kecuali metode ini akan selalu mengembalikan kode status 301:
// Simple redirect Route::redirect("/class", "/myClass"); // Redirect with custom status Route::redirect("/home", "/office", 305); // Route redirect with 301 status code Route::permanentRedirect("/home", "office");
Di dalam rute pengalihan, kami dilarang menggunakan kata kunci "tujuan" dan "status" sebagai parameter karena disediakan oleh Laravel.
// Illegal to use Route::redirect("/home", "/office/{status}");
Tampilan
Tampilan adalah. file blade.php yang kami gunakan untuk merender frontend aplikasi Laravel kami. Ini menggunakan mesin template blade, dan ini adalah cara default untuk membangun aplikasi full-stack hanya dengan menggunakan Laravel.
Jika kita ingin rute kita mengembalikan tampilan, kita cukup menggunakan metode tampilan pada fasad Rute. Itu menerima parameter rute, nama tampilan, dan array nilai opsional untuk diteruskan ke tampilan.
// When the user accesses my-domain.com/homepage // the homepage.blade.php file will be rendered Route::view("/homepage", "homepage");
Anggaplah tampilan kita ingin mengatakan “Halo, {name}
” dengan meneruskan larik opsional dengan parameter itu. Kita dapat melakukannya dengan kode berikut (jika parameter yang hilang diperlukan dalam tampilan, permintaan akan gagal dan menimbulkan kesalahan):
Route::view('/homepage', 'homepage', ['name' => "Kinsta"]);
Daftar Rute
Seiring bertambahnya ukuran aplikasi Anda, jumlah permintaan yang perlu dialihkan juga akan meningkat. Dan dengan sejumlah besar informasi dapat menimbulkan kebingungan besar.
Di sinilah artisan route:list command
dapat membantu kita. Ini memberikan gambaran umum tentang semua rute yang ditentukan dalam aplikasi, middlewares, dan pengontrolnya.
php artisan route:list
Ini akan menampilkan daftar semua rute tanpa middlewares. Untuk ini, kita harus menggunakan flag -v
:
php artisan route:list -v
Dalam situasi di mana Anda mungkin menggunakan desain berbasis domain di mana rute Anda memiliki nama khusus di jalurnya, Anda dapat menggunakan kemampuan pemfilteran dari perintah ini seperti:
php artisan route:list –path=api/account
Ini hanya akan menampilkan rute yang dimulai dengan api/account .
Di sisi lain, kita dapat menginstruksikan Laravel untuk mengecualikan atau menyertakan rute yang ditentukan pihak ketiga dengan menggunakan opsi –except-vendor
atau –only-vendor
.
Parameter Rute
Terkadang Anda mungkin perlu mengambil segmen URI dengan rute, seperti ID pengguna atau token. Kita bisa melakukannya dengan mendefinisikan parameter rute, yang selalu terbungkus dalam kurung kurawal ( {}
) dan hanya boleh terdiri dari karakter alfabet.
Jika rute kita memiliki dependensi di dalam panggilan baliknya, wadah layanan Laravel akan secara otomatis menyuntikkannya:
use Illuminate\Http\Request; use Controllers/DashboardController; Route::post('/dashboard/{id}, function (Request $request, string $id) { return 'User:' . $id; } Route::get('/dashboard/{id}, DashboardController.php);
Parameter yang Diperlukan
Parameter yang diperlukan Laravel adalah parameter dalam rute yang tidak boleh kita lewati saat kita melakukan panggilan. Jika tidak, kesalahan akan dilemparkan:
Route::post("/gdpr/{userId}", GetGdprDataController.php");
Sekarang di dalam GetGdprDataController.php kita akan memiliki akses langsung ke parameter $userId .
public function __invoke(int $userId) { // Use the userId that we received… }
Rute dapat mengambil sejumlah parameter. Mereka disuntikkan dalam callback/controller rute berdasarkan urutan di mana mereka terdaftar:
// api.php Route::post('/gdpr/{userId}/{userName}/{userAge}', GetGdprDataController.php); // GetGdprDataController.php public function __invoke(int $userId, string $userName, int $userAge) { // Use the parameters… }
Parameter Opsional
Dalam situasi di mana kami ingin melakukan sesuatu pada rute ketika hanya ada parameter dan tidak ada yang lain, semuanya tanpa memengaruhi keseluruhan aplikasi, kami dapat menambahkan parameter opsional. Parameter opsional ini dilambangkan dengan ?
ditambahkan kepada mereka:
Route::get('/user/{age?}', function (int $age = null) { if (!$age) Log::info("User doesn't have age set"); else Log::info("User's age is " . $age); } Route::get('/user/{name?}', function (int $name = "John Doe") { Log::info("User's name is " . $name); }
Rute Wildcard
Laravel menyediakan cara bagi kita untuk memfilter seperti apa parameter opsional atau wajib kita.
Katakanlah kita menginginkan string ID pengguna. Kami dapat memvalidasinya seperti pada level rute menggunakan metode where
.
Metode where
menerima nama parameter dan aturan regex yang akan diterapkan pada validasi. Secara default, ini mengambil parameter pertama, tetapi jika kita memiliki banyak, kita dapat melewatkan array dengan nama parameter sebagai kunci dan aturan sebagai nilainya, dan Laravel akan mengurai semuanya untuk kita:
Route::get('/user/{age}', function (int $age) { // }->where('age', '[0-9]+'); Route::get('/user/{age}', function (int $age) { // }->where('[0-9]+'); Route::get('/user/{age}/{name}', function (int $age, string $name) { // }->where(['age' => '[0-9]+', 'name' => '[az][Az]+');
Kita dapat melangkah lebih jauh dan menerapkan validasi pada semua rute dalam aplikasi kita dengan menggunakan metode pattern
pada fasad Route
:
Route::pattern('id', '[0-9]+');
Ini akan memvalidasi setiap parameter id
dengan ekspresi regex ini. Dan begitu kita mendefinisikannya, itu akan diterapkan secara otomatis ke semua rute menggunakan nama parameter itu.
Seperti yang bisa kita lihat, Laravel menggunakan karakter /
sebagai pemisah di jalur. Jika kita ingin menggunakannya di jalur, kita harus secara eksplisit mengizinkannya menjadi bagian dari placeholder kita menggunakan regex where
.
Route::get('/find/{query}', function ($query) { // })->where('query', , '.*');
Satu-satunya downside adalah bahwa itu hanya akan didukung di segmen rute terakhir.
Rute bernama
Seperti namanya, kita dapat menamai rute, yang membuatnya nyaman untuk membuat URL atau mengarahkan ulang ke rute tertentu.
Cara Membuat Rute Bernama
Cara sederhana untuk membuat rute bernama disediakan oleh metode name
yang dirantai pada fasad Route
. Setiap nama rute harus unik:
Route::get('/', function () { })->name("homepage");
Grup Rute
Grup rute memungkinkan Anda berbagi atribut rute seperti middlewares di sejumlah besar rute tanpa perlu mendefinisikannya kembali di setiap rute.
Middleware
Menetapkan middleware ke semua rute yang kami miliki memungkinkan kami untuk menggabungkannya dalam grup, pertama dengan menggunakan metode group
. Satu hal yang perlu dipertimbangkan adalah bahwa middleware dijalankan sesuai urutan penerapannya ke grup:
Route:middleware(['AuthMiddleware', 'SessionMiddleware'])->group(function () { Route::get('/', function() {} ); Route::post('/upload-picture', function () {} ); });
Pengontrol
Ketika suatu grup menggunakan pengontrol yang sama, kita dapat menggunakan metode controller
untuk menentukan pengontrol umum untuk semua rute dalam grup itu. Sekarang kita harus menentukan metode yang akan dipanggil oleh rute.
Route::controller(UserController::class)->group(function () { Route::get('/orders/{userId}', 'getOrders'); Route::post('/order/{id}', 'postOrder'); });
Perutean Subdomain
Nama subdomain adalah informasi tambahan yang ditambahkan di awal nama domain situs web. Ini memungkinkan situs web untuk memisahkan dan mengatur konten mereka untuk fungsi tertentu, seperti toko online, blog, presentasi, dan sebagainya dari situs web lainnya.
Rute kami dapat digunakan untuk menangani perutean subdomain. Kami dapat menangkap domain dan sebagian dari subdomain untuk digunakan di pengontrol dan rute kami. Dengan bantuan metode domain
pada fasad Route
, kami dapat mengelompokkan rute kami di bawah satu domain:
Route::domain('{store}.enterprise.com')->group(function() { Route::get('order/{id}', function (Account $account, string $id) { // Your Code } });
Awalan dan Awalan Nama
Setiap kali kita memiliki grup rute, alih-alih memodifikasinya satu per satu, kita dapat menggunakan utilitas tambahan yang disediakan Laravel, seperti prefix
dan name
pada fasad Route
.
Metode prefix
dapat digunakan untuk mengawali setiap rute dalam grup dengan URI yang diberikan, dan metode name
dapat digunakan untuk mengawali setiap nama rute dengan string yang diberikan.
Ini memungkinkan kita untuk membuat hal-hal baru seperti rute admin tanpa harus mengubah setiap nama atau awalan untuk mengidentifikasinya:
Route::name('admin.")->group(function() { Route::prefix("admin")->group(function() { Route::get('/get')->name('get'); Route::put('/put')->name(put'); Route::post('/post')->name('post'); }); });
Sekarang URI untuk rute ini adalah admin/get
, admin/put
, admin/post
, dan nama admin.get
, admin.put
, dan admin.post
.
Caching Rute
Saat menerapkan aplikasi ke server produksi, pengembang Laravel yang baik akan memanfaatkan cache rute Laravel.
Apa itu Caching Rute?
Caching rute mengurangi jumlah waktu yang diperlukan untuk mendaftarkan semua rute aplikasi.
Menjalankan php artisan route:cache
sebuah instance dari Illuminate/Routing/RouteCollection
dihasilkan, dan setelah dikodekan, keluaran serial ditulis ke bootstrap/cache.routes.php
.
Sekarang permintaan lainnya akan memuat file cache ini jika ada. Oleh karena itu, aplikasi kita tidak lagi harus mengurai dan mengonversi entri dari file rute menjadi objek Illuminate/Routing/Route
di Illuminate/Routing/RouteCollection
.
Mengapa Penting Menggunakan Caching Rute
Dengan tidak menggunakan fitur caching rute yang disediakan Laravel, aplikasi Anda berisiko berjalan lebih lambat dari yang seharusnya, yang pada gilirannya dapat menurunkan penjualan, retensi pengguna, dan kepercayaan pada merek Anda.
Bergantung pada skala proyek Anda dan berapa banyak rute yang ada, menjalankan perintah caching rute sederhana dapat mempercepat aplikasi Anda mulai dari 130% hingga 500% — keuntungan besar dengan hampir tanpa usaha.
Ringkasan
Routing adalah tulang punggung pengembangan backend. Kerangka kerja Laravel unggul dalam hal ini dengan menyediakan cara verbose untuk mendefinisikan dan mengelola rute.
Pengembangan memang dapat diakses oleh semua orang dan membantu mempercepat aplikasi hanya dengan membangunnya di Laravel.
Apa trik dan tip lain yang Anda temui terkait rute Laravel? Beri tahu kami di bagian komentar!