การเรียนรู้เส้นทาง Laravel
เผยแพร่แล้ว: 2022-12-12เมื่อพูดถึงแบ็กเอนด์ นักพัฒนาจะพบเส้นทางในที่สุด เส้นทางสามารถพิจารณาได้ว่าเป็นกระดูกสันหลังของแบ็กเอนด์ เนื่องจากทุกคำขอที่เซิร์ฟเวอร์ได้รับจะถูกเปลี่ยนเส้นทางไปยังตัวควบคุมผ่านรายการเส้นทางที่แมปคำขอไปยังตัวควบคุมหรือการดำเนินการ
Laravel ซ่อนรายละเอียดการใช้งานจำนวนมากสำหรับเราและมาพร้อมกับน้ำตาลวากยสัมพันธ์จำนวนมากเพื่อช่วยให้นักพัฒนาทั้งใหม่และที่มีประสบการณ์พัฒนาเว็บแอปพลิเคชันของพวกเขา
มาดูวิธีการจัดการเส้นทางใน Laravel กัน
การกำหนดเส้นทางแบ็กเอนด์และการเขียนสคริปต์ข้ามไซต์ใน Laravel
บนเซิร์ฟเวอร์ มีทั้งเส้นทางสาธารณะและเส้นทางส่วนตัว เส้นทางสาธารณะอาจเป็นสาเหตุของความกังวลเนื่องจากมีความเป็นไปได้ที่จะเกิด cross-site scripting (XSS) ซึ่งเป็นการโจมตีแบบฉีดที่สามารถทำให้คุณและผู้ใช้ของคุณเสี่ยงต่อผู้ไม่หวังดี
ปัญหาคือผู้ใช้สามารถเปลี่ยนเส้นทางจากเส้นทางที่ไม่ต้องใช้โทเค็นเซสชันไปยังเส้นทางที่เปลี่ยนเส้นทางได้ และพวกเขาจะยังคงเข้าถึงได้โดยไม่ต้องใช้โทเค็น
วิธีที่ง่ายที่สุดในการแก้ปัญหานี้คือการบังคับใช้ส่วนหัว HTTP ใหม่ โดยเพิ่ม "ผู้อ้างอิง" ในเส้นทางเพื่อลดสถานการณ์นี้:
'main' => [ 'path' => '/main', 'referrer' => 'required,refresh-empty', 'target' => Controller\DashboardController::class . '::mainAction' ]
การกำหนดเส้นทางพื้นฐานของ Laravel
ใน Laravel เส้นทางอนุญาตให้ผู้ใช้กำหนดเส้นทางคำขอที่เหมาะสมไปยังตัวควบคุมที่ต้องการ Laravel Route ขั้นพื้นฐานที่สุดยอมรับ Uniform Asset Identifier (เส้นทางเส้นทางของคุณ) และการปิดซึ่งสามารถเป็นได้ทั้งฟังก์ชันหรือคลาส
ใน Laravel เส้นทางถูกสร้างขึ้นภายในไฟล์ web.php และ api.php Laravel มาพร้อมกับสองเส้นทางตามค่าเริ่มต้น: หนึ่งเส้นทางสำหรับเว็บและอีกหนึ่งเส้นทางสำหรับ API
เส้นทางเหล่านี้อยู่ในโฟลเดอร์ route/ แต่โหลดไว้ใน Providers/RouteServiceProvider.php
แทนที่จะทำเช่นนี้ เราสามารถโหลดเส้นทางได้โดยตรงภายใน RouteServiceProvider.php โดยข้าม เส้นทาง/ โฟลเดอร์ไปเลย
การเปลี่ยนเส้นทาง
เมื่อเรากำหนดเส้นทาง เรามักจะต้องการเปลี่ยนเส้นทางผู้ใช้ที่เข้าถึงเส้นทางนั้น และเหตุผลก็แตกต่างกันไป อาจเป็นเพราะเป็นเส้นทางที่เลิกใช้แล้ว และเราได้เปลี่ยนแบ็กเอนด์หรือเซิร์ฟเวอร์ หรืออาจเป็นเพราะเราต้องการติดตั้งการตรวจสอบสิทธิ์แบบสองปัจจัย (2FA) เป็นต้น
Laravel มีวิธีง่ายๆ ในการทำเช่นนี้ ด้วยความเรียบง่ายของเฟรมเวิร์ก เราจึงสามารถใช้วิธีการเปลี่ยนเส้นทางบนส่วนหน้าของเส้นทาง ซึ่งยอมรับเส้นทางเข้าและเส้นทางที่จะเปลี่ยนเส้นทางไป
เราสามารถให้รหัสสถานะสำหรับการเปลี่ยนเส้นทางเป็นพารามิเตอร์ที่สาม วิธีการ permanentRedirect
จะทำเช่นเดียวกับวิธี redirect
ยกเว้นว่าจะส่งคืนรหัสสถานะ 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");
ภายในเส้นทางการเปลี่ยนเส้นทาง เราไม่ได้รับอนุญาตให้ใช้คีย์เวิร์ด "ปลายทาง" และ "สถานะ" เป็นพารามิเตอร์ เนื่องจาก Laravel สงวนไว้
// Illegal to use Route::redirect("/home", "/office/{status}");
มุมมอง
มุมมองคือ ไฟล์ blade.php ที่เราใช้เพื่อเรนเดอร์ส่วนหน้าของแอปพลิเคชัน Laravel ของเรา ใช้เครื่องมือสร้างเทมเพลตเบลด และเป็นวิธีเริ่มต้นในการสร้างแอปพลิเคชันแบบเต็มสแต็กโดยใช้ Laravel เท่านั้น
หากเราต้องการให้เส้นทางของเราคืนมุมมอง เราก็สามารถใช้วิธีดูบนส่วนหน้าของเส้นทางได้ โดยจะยอมรับพารามิเตอร์เส้นทาง ชื่อมุมมอง และอาร์เรย์ของค่าทางเลือกที่จะส่งผ่านไปยังมุมมอง
// When the user accesses my-domain.com/homepage // the homepage.blade.php file will be rendered Route::view("/homepage", "homepage");
สมมติว่ามุมมองของเราต้องการพูดว่า "สวัสดี {name}
" โดยส่งอาร์เรย์ทางเลือกที่มีพารามิเตอร์นั้น เราสามารถทำได้โดยใช้โค้ดต่อไปนี้ (หากพารามิเตอร์ที่ขาดหายไปในมุมมอง คำขอจะล้มเหลวและเกิดข้อผิดพลาด):
Route::view('/homepage', 'homepage', ['name' => "Kinsta"]);
รายการเส้นทาง
เมื่อแอปพลิเคชันของคุณมีขนาดใหญ่ขึ้น จำนวนคำขอที่ต้องกำหนดเส้นทางก็จะเพิ่มขึ้นตามไปด้วย และด้วยข้อมูลจำนวนมากอาจทำให้เกิดความสับสนได้
นี่คือจุดที่ artisan route:list command
สามารถช่วยเราได้ ซึ่งแสดงภาพรวมของเส้นทางทั้งหมดที่กำหนดไว้ในแอปพลิเคชัน มิดเดิลแวร์ และตัวควบคุม
php artisan route:list
มันจะแสดงรายการเส้นทางทั้งหมดที่ไม่มีมิดเดิลแวร์ สำหรับสิ่งนี้เราต้องใช้แฟล็ก -v
:
php artisan route:list -v
ในสถานการณ์ที่คุณอาจใช้การออกแบบที่ขับเคลื่อนด้วยโดเมน ซึ่งเส้นทางของคุณมีชื่อเฉพาะในเส้นทาง คุณสามารถใช้ความสามารถในการกรองของคำสั่งนี้ดังนี้:
php artisan route:list –path=api/account
นี่จะแสดงเฉพาะเส้นทางที่ขึ้นต้นด้วย api/account
ในทางกลับกัน เราสามารถสั่งให้ Laravel แยกหรือรวมเส้นทางที่กำหนดโดยบุคคลที่สามได้โดยใช้ตัวเลือก –except-vendor
หรือ –only-vendor
พารามิเตอร์เส้นทาง
บางครั้งคุณอาจต้องบันทึกส่วนของ URI ด้วยเส้นทาง เช่น ID ผู้ใช้หรือโทเค็น เราสามารถทำได้โดยกำหนดพารามิเตอร์เส้นทาง ซึ่งจะอยู่ในวงเล็บปีกกา ( {}
) เสมอ และควรประกอบด้วยอักขระที่เป็นตัวอักษรเท่านั้น
หากเส้นทางของเรามีการอ้างอิงภายในการโทรกลับ คอนเทนเนอร์บริการ Laravel จะแทรกพวกมันโดยอัตโนมัติ:
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);
พารามิเตอร์ที่จำเป็น
พารามิเตอร์ที่จำเป็นของ Laravel คือพารามิเตอร์ในเส้นทางที่เราไม่ได้รับอนุญาตให้ข้ามเมื่อเราโทรออก มิฉะนั้นจะเกิดข้อผิดพลาด:
Route::post("/gdpr/{userId}", GetGdprDataController.php");
ตอนนี้ภายใน GetGdprDataController.php เราจะสามารถเข้าถึงพารามิเตอร์ $userId ได้โดยตรง
public function __invoke(int $userId) { // Use the userId that we received… }
เส้นทางสามารถใช้พารามิเตอร์จำนวนเท่าใดก็ได้ พวกมันถูกฉีดเข้าไปในเส้นทางการโทรกลับ/ตัวควบคุมตามลำดับที่แสดง:
// api.php Route::post('/gdpr/{userId}/{userName}/{userAge}', GetGdprDataController.php); // GetGdprDataController.php public function __invoke(int $userId, string $userName, int $userAge) { // Use the parameters… }
พารามิเตอร์ทางเลือก
ในสถานการณ์ที่เราต้องการทำบางอย่างบนเส้นทางที่มีแต่พารามิเตอร์เท่านั้นและไม่มีอย่างอื่น ทั้งหมดนี้โดยไม่กระทบกับทั้งแอปพลิเคชัน เราสามารถเพิ่มพารามิเตอร์เผื่อเลือกได้ พารามิเตอร์ทางเลือกเหล่านี้แสดงโดย ?
ต่อท้ายพวกเขา:
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); }
สัญลักษณ์ประจำเส้นทาง
Laravel ช่วยให้เราสามารถกรองได้ว่าพารามิเตอร์ทางเลือกหรือพารามิเตอร์ที่จำเป็นของเราควรมีลักษณะอย่างไร
สมมติว่าเราต้องการสตริงรหัสผู้ใช้ เราสามารถตรวจสอบได้ในระดับเส้นทางโดยใช้เมธอด where
เมธอด where
ยอมรับชื่อของพารามิเตอร์และกฎ regex ที่จะใช้กับการตรวจสอบความถูกต้อง โดยค่าเริ่มต้น จะใช้พารามิเตอร์ตัวแรก แต่ถ้าเรามีหลายพารามิเตอร์ เราสามารถส่งอาร์เรย์ที่มีชื่อของพารามิเตอร์เป็นคีย์และกฎเป็นค่า และ Laravel จะแยกวิเคราะห์ทั้งหมดให้เรา:
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]+');
เราสามารถก้าวไปอีกขั้นและใช้การตรวจสอบกับเส้นทางทั้งหมดในแอปพลิเคชันของเราโดยใช้วิธี pattern
บนส่วนหน้าของ Route
:
Route::pattern('id', '[0-9]+');
สิ่งนี้จะตรวจสอบทุกพารามิเตอร์ id
ด้วยนิพจน์ regex นี้ และเมื่อเรากำหนดไว้ มันจะถูกนำไปใช้กับทุกเส้นทางโดยอัตโนมัติโดยใช้ชื่อพารามิเตอร์นั้น
อย่างที่เราเห็น Laravel ใช้อักขระ /
เป็นตัวคั่นในเส้นทาง หากเราต้องการใช้ในเส้นทาง เราต้องอนุญาตให้เป็นส่วนหนึ่งของตัวยึดตำแหน่งของเราอย่างชัดเจนโดยใช้ where
regex
Route::get('/find/{query}', function ($query) { // })->where('query', , '.*');
ข้อเสียเพียงอย่างเดียวคือรองรับเฉพาะในส่วนเส้นทางสุดท้ายเท่านั้น
เส้นทางที่มีชื่อ
ตามชื่อที่แนะนำ เราสามารถตั้งชื่อเส้นทางได้ ซึ่งทำให้สะดวกในการสร้าง URL หรือเปลี่ยนเส้นทางสำหรับเส้นทางใดเส้นทางหนึ่งโดยเฉพาะ
วิธีสร้างเส้นทางที่มีชื่อ
วิธีง่ายๆ ในการสร้างเส้นทางที่มีชื่อนั้นมีให้โดยวิธีการตั้ง name
ที่เชื่อมโยงอยู่บนส่วนหน้าของ Route
ชื่อแต่ละเส้นทางไม่ควรซ้ำกัน:
Route::get('/', function () { })->name("homepage");
กลุ่มเส้นทาง
กลุ่มกระบวนการผลิตทำให้คุณสามารถแชร์แอตทริบิวต์ของเส้นทาง เช่น มิดเดิลแวร์ข้ามเส้นทางจำนวนมาก โดยไม่จำเป็นต้องกำหนดใหม่ในแต่ละเส้นทาง
ตัวกลาง
การกำหนดมิดเดิลแวร์ให้กับทุกเส้นทางที่เรามีทำให้เรารวมมันไว้ในกลุ่มได้ โดยใช้วิธี group
ก่อน สิ่งหนึ่งที่ต้องพิจารณาคือมิดเดิลแวร์จะถูกดำเนินการตามลำดับที่ใช้กับกลุ่ม:
Route:middleware(['AuthMiddleware', 'SessionMiddleware'])->group(function () { Route::get('/', function() {} ); Route::post('/upload-picture', function () {} ); });
ตัวควบคุม
เมื่อกลุ่มใช้ตัวควบคุมเดียวกัน เราสามารถใช้วิธี controller
เพื่อกำหนดตัวควบคุมร่วมสำหรับเส้นทางทั้งหมดภายในกลุ่มนั้น ตอนนี้เราต้องระบุวิธีการที่เส้นทางจะเรียก
Route::controller(UserController::class)->group(function () { Route::get('/orders/{userId}', 'getOrders'); Route::post('/order/{id}', 'postOrder'); });
การกำหนดเส้นทางโดเมนย่อย
ชื่อโดเมนย่อยเป็นส่วนของข้อมูลเพิ่มเติมที่เพิ่มไว้ข้างหน้าชื่อโดเมนของเว็บไซต์ ซึ่งช่วยให้เว็บไซต์สามารถแยกและจัดระเบียบเนื้อหาสำหรับการทำงานเฉพาะได้ เช่น ร้านค้าออนไลน์ บล็อก งานนำเสนอ และอื่นๆ จากส่วนที่เหลือของเว็บไซต์
เส้นทางของเราสามารถใช้เพื่อจัดการการกำหนดเส้นทางโดเมนย่อย เราสามารถจับโดเมนและส่วนหนึ่งของโดเมนย่อยสำหรับการใช้งานในตัวควบคุมและเส้นทางของเรา ด้วยความช่วยเหลือของ domain
เมธอดบนส่วนหน้า Route
เราสามารถจัดกลุ่มเส้นทางของเราภายใต้โดเมนเดียวได้:
Route::domain('{store}.enterprise.com')->group(function() { Route::get('order/{id}', function (Account $account, string $id) { // Your Code } });
คำนำหน้าและคำนำหน้าชื่อ
เมื่อใดก็ตามที่เรามีกลุ่มของเส้นทาง แทนที่จะแก้ไขทีละกลุ่ม เราสามารถใช้โปรแกรมอรรถประโยชน์พิเศษที่ Laravel มีให้ เช่น prefix
และ name
บนส่วนหน้าของ Route
เมธอดคำนำ prefix
สามารถใช้เพื่อเติมคำนำหน้าแต่ละเส้นทางในกลุ่มด้วย URI ที่กำหนด และเมธอด name
สามารถใช้นำหน้าชื่อเส้นทางแต่ละรายการด้วยสตริงที่กำหนด
สิ่งนี้ทำให้เราสามารถสร้างสิ่งใหม่ๆ เช่น เส้นทางผู้ดูแลระบบโดยไม่จำเป็นต้องแก้ไขชื่อหรือคำนำหน้าแต่ละรายการและทั้งหมดเพื่อระบุ:
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'); }); });
ตอนนี้ URI สำหรับเส้นทางเหล่านี้จะเป็น admin/get
, admin/put
, admin/post
และชื่อ admin.get
, admin.put
และ admin.post
การแคชเส้นทาง
เมื่อปรับใช้แอปพลิเคชันกับเซิร์ฟเวอร์ที่ใช้งานจริง นักพัฒนา Laravel ที่ดีจะใช้ประโยชน์จากแคชเส้นทางของ Laravel
การแคชเส้นทางคืออะไร?
การแคชเส้นทางจะลดระยะเวลาที่ใช้ในการลงทะเบียนเส้นทางแอปพลิเคชันทั้งหมด
การรัน php artisan route:cache
จะสร้างอินสแตนซ์ของ Illuminate/Routing/RouteCollection
และหลังจากเข้ารหัสแล้ว เอาต์พุตซีเรียลไลซ์จะถูกเขียนไปที่ bootstrap/cache.routes.php
ตอนนี้คำขออื่น ๆ จะโหลดไฟล์แคชนี้หากมีอยู่ ดังนั้น แอปพลิเคชันของเราจึงไม่ต้องแยกวิเคราะห์และแปลงรายการจากไฟล์เส้นทางเป็นวัตถุ Illuminate/Routing/Route
ใน Illuminate/Routing/RouteCollection
อีกต่อไป
เหตุใดการใช้การแคชเส้นทางจึงมีความสำคัญ
หากไม่ใช้คุณสมบัติการแคชเส้นทางที่ Laravel มอบให้ แอปพลิเคชันของคุณอาจเสี่ยงที่จะทำงานช้ากว่าที่ควรจะเป็น ซึ่งอาจส่งผลให้ยอดขาย การรักษาผู้ใช้ และความเชื่อถือในแบรนด์ของคุณลดลง
ขึ้นอยู่กับขนาดของโครงการและจำนวนเส้นทางที่มี การเรียกใช้คำสั่งการแคชเส้นทางอย่างง่ายสามารถเพิ่มความเร็วแอปพลิเคชันของคุณได้ตั้งแต่ 130% ถึง 500% ซึ่งเป็นกำไรมหาศาลโดยแทบไม่ต้องใช้ความพยายามเลย
สรุป
การกำหนดเส้นทางเป็นหัวใจสำคัญของการพัฒนาแบ็กเอนด์ เฟรมเวิร์ก Laravel เก่งในด้านนี้โดยให้วิธีการกำหนดและจัดการเส้นทางโดยละเอียด
การพัฒนาสามารถเข้าถึงได้สำหรับทุกคนและช่วยเพิ่มความเร็วของแอปพลิเคชันโดยอาศัยการสร้างใน Laravel
คุณพบลูกเล่นและเคล็ดลับอะไรอีกบ้างเกี่ยวกับเส้นทาง Laravel แจ้งให้เราทราบในส่วนความคิดเห็น!