
ใน Laravel เวลาที่เราเข้าลิงค์ใดๆ ก็ตาม เราจะมี Routing ที่ช่วยกำหนดเส้นทางการเข้าถึงว่าจะให้ไปทำอะไรที่ไหน นะครับ เราเรียกสิ่งนี้ว่า Routing เช่น ผู้ใช้ต้องการเข้าลิงค์ itoffside.com/theboy/1234 เราก็เขียนกำหนดเส้นทางให้ไปทางไหน เป็นต้น โดยทั่วไปแล้วการร้องขอ URL จากผู้ใช้มาแล้ว เราจะกำหนดเส้นทางและส่งไปให้กับ Controller ทำงานต่อแทน โดยบทความนี้จะกล่าวถึงกำหนดเส้นทางโดยให้ Controller ทำงานต่อแทนเป็นหลัก
Basic Routing
เส้นทางการร้องขอทั้งหมดของระบบ Laravel จะถูกผ่านมาที่ routes/web.php (สำหรับเว็บ ตัวอย่างบทความนี้ใช้ไฟล์นี้ก่อน) หรือ routes/api.php (สำหรับ APi)
ให้เราเปิดไฟล์ routes/web.php เราจะเห็น code เขียน
1 2 3 |
Route::get('/', function () { return view('welcome'); }); |
หมายความว่าเมื่อ request มาหน้าแรก แล้วให้ แสดง view welcome (อยู่ที่ resources/views/welcome.blade.php) จะเห็นได้ว่าเราไม่จำเป็นต้องโยนให้ Controller ก็สามารถทำงานได้เหมือนกัน แต่ที่เราให้ routing โยนให้ Controller ทำงานเพราะ Code จะได้เป็นระเบียบเรียบร้อย
ส่วนหากเราต้องการให้ Routing แล้วโยนให้ Controller ทำงานต่อนั้น ทำได้โดยแบบด้านล่างนี้ครับ
1 |
Route::get('/', 'HomeController@index'); |
ความหมายคือเมื่อ request มาหน้าแรก แล้วสั่งให้ Controller ชื่อ HomeController และ Function index() ทำงานครับ เราลองมาสร้าง Controller กันครับ สามารถสร้างได้ 2 แบบคือ
- สร้างเอง โดยเข้าไปสร้างไฟล์ที่ app/Http/Controllers/HomeController.php
- ใช้ Command line Artisan สร้าง โดยให้เราเปิด Command line ในโปรเจ็คของเราก่อนหากใครทำไม่เป็นให้ดูบทความที่ 2 https://www.itoffside.com/laravel-ep2-install/ เมื่อเราเปิด command line แล้วให้พิมพ์คำสั่ง
1php artisan make:controller HomeController
แล้ว artisan จะสร้าง controller ไว้ที่ app/Http/Controllers ให้เราเลยครับ ง่ายๆไหมครับ - สร้าง function index ใน HomeController
เพียงเท่านี้ครับสำหรับการให้ Routing โยนให้ Controller ทำงานต่อแล้ว Controller ก็จะทำงานตามที่เราเขียน code ไว้
Route Parameters
ในบางครั้งในเว็บ เราจำเป็นต้องมีค่า parameter ส่งไปทาง url เช่น itoffside.com/product/1234 จะเห็นว่า parameter 1234 นั้นเป็นค่าที่อาจจะเป็นค่าอื่นได้เช่นกันเช่น 5678 สำหรับ Routing laravel ก็มีวิธีการส่งค่าเหมือนกัน เรามาดู code กันว่าเขียนแบบไหน
ใน routes/web.php เขียนต่อจากอันเดิมเป็น
1 |
Route::get('product/{id}', 'HomeController@product'); |
จะเห็นว่าเรามีการส่ง parameter {id} ไปด้วย (ชื่ออาจจะเป็นอย่างอื่นก็ได้ไม่จำเป็นต้องเป็น id เอาตามความเข้าใจของเรา) โดย parameter ต้องคลุมด้วย {} เสมอ
แล้วเราก็ไปเขียน code ใน HomeController เพิ่มในบรรทัดที่ 14-17
จาก code หมายถึงเรา สร้าง function product แล้วรับ parameter ที่ routing ส่งมาให้เรา ลองมาดูผลลัพท์ของ code กัน
ปล. อย่าลืม เปิด command แล้ว run คำสั่ง php artisan serve ด้วยนะครับ
จะเห็นว่าผม request url เป็น product/1234 แล้วใน controller ผมสั่งให้ แสดง parameter 1234 ก็เลยได้ผลลัพท์ตามรูปภาพด้านบน
Routing Methods
Routing methods คือหนึ่งอย่างที่ Laravel มีความพิเศษ เพราะว่าเราสามารถกำหนด HTTP Verb ได้เช่นเราอยากให้ routing นี้เป็น GET, POST, PUT, DELETE แบบง่ายๆเลย ลองดูตัวอย่าง
1 2 3 4 5 6 |
Route::get($uri, $callback); Route::post($uri, $callback); Route::put($uri, $callback); Route::patch($uri, $callback); Route::delete($uri, $callback); Route::options($uri, $callback); |
ผมจะยกตัวอย่างการใช้งาน HTTP Verb ประเภท POST
ในหน้า view ผมเขียน form จะเป็นแบบนี้
1 2 3 4 |
<form method="POST" action="/product"> @csrf ... </form> |
โปรดระวังหากเรา request ไม่ตรง verb จะเกิด error ทันที
Routing Groups prefix
เป็นการจัดกลุ่ม routing โดยอ้างอิงชื่อ prefix ที่เราไม่จำเป็นต้องมาสร้างชื่อซ้ำๆเดิม ยกตัวอย่างเช่นคุณมี Routing
1 2 3 4 |
Route::get('product/{id}', 'productController@show'); Route::post('product', 'productController@store'); Route::put('product/{id}', 'productController@update'); Route::delete('product/{id}', 'productController@destroy'); |
จะเห็นว่าชื่อ product เรียงกัน ซึ่งเราสามารถจัดเป็นกลุ่มของ prefix “product” ได้โดยเขียนคำสั่งนี้ไป
1 2 3 4 5 6 |
Route::prefix('product')->group(function () { Route::get('{id}', 'productController@show'); Route::post('', 'productController@store'); Route::put('{id}', 'productController@update'); Route::delete('{id}', 'productController@destroy'); }); |
สรุป
Routing ใน Laravel นั้นจำเป็นอย่างมาก เพราะ ทุก Request เราต้องควบคุมผ่าน Routing นี้โดย Routing ของ laravel ไม่ได้ Generate อัตโนมัติเหมือน Codeigniter ที่มีรูปแบบ project/controller/methods/{id} ที่เขียนง่าย เริ่มต้นได้ง่าย แต่สำหรับ laravel เราต้องมากำหนด routing เอง ซึ่งตอนแรกอาจจะคิดว่าลำบาก ยาก แต่หากได้ใช้ไปสักพักแล้วมันเป็นอะไรที่ง่ายและสะดวก ดังนั้นเราจึงจำเป็นต้องเรียนรู้และเข้าใจ เพราะหากเราเข้าใจแล้ว เราจะสามรถเขียนเว็บ/ระบบ ได้ดังใจเราต้องการ
Target class [HomeController] does not exist.
ต้องแก้ยังไงครับ