การเรียนรู้เส้นทาง 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

บรรทัดคำสั่งที่แสดงสถานะเริ่มต้นของผู้ให้บริการเส้นทางของ Laravel
สถานะเริ่มต้นของผู้ให้บริการเส้นทางของ Laravel

แทนที่จะทำเช่นนี้ เราสามารถโหลดเส้นทางได้โดยตรงภายใน RouteServiceProvider.php โดยข้าม เส้นทาง/ โฟลเดอร์ไปเลย

หน้าต่างบรรทัดคำสั่งที่แสดงการโหลดเส้นทาง Laravel โดยตรงในผู้ให้บริการ
กำลังโหลดเส้นทาง Laravel โดยตรงในผู้ให้บริการ

การเปลี่ยนเส้นทาง

เมื่อเรากำหนดเส้นทาง เรามักจะต้องการเปลี่ยนเส้นทางผู้ใช้ที่เข้าถึงเส้นทางนั้น และเหตุผลก็แตกต่างกันไป อาจเป็นเพราะเป็นเส้นทางที่เลิกใช้แล้ว และเราได้เปลี่ยนแบ็กเอนด์หรือเซิร์ฟเวอร์ หรืออาจเป็นเพราะเราต้องการติดตั้งการตรวจสอบสิทธิ์แบบสองปัจจัย (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 หรือเปลี่ยนเส้นทางสำหรับเส้นทางใดเส้นทางหนึ่งโดยเฉพาะ

กำลังดิ้นรนกับการหยุดทำงานและปัญหา WordPress? Kinsta เป็นโซลูชันโฮสติ้งที่ออกแบบมาเพื่อช่วยคุณประหยัดเวลา! ตรวจสอบคุณสมบัติของเรา

วิธีสร้างเส้นทางที่มีชื่อ

วิธีง่ายๆ ในการสร้างเส้นทางที่มีชื่อนั้นมีให้โดยวิธีการตั้ง 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 ในคำแนะนำอย่างละเอียด Click to Tweet

การพัฒนาสามารถเข้าถึงได้สำหรับทุกคนและช่วยเพิ่มความเร็วของแอปพลิเคชันโดยอาศัยการสร้างใน Laravel

คุณพบลูกเล่นและเคล็ดลับอะไรอีกบ้างเกี่ยวกับเส้นทาง Laravel แจ้งให้เราทราบในส่วนความคิดเห็น!