จากการ คอนฟิก Routing เบื้องต้น เมื่อมี URI หรือ Route เพิ่มขึ้นเรื่อยๆ แทนที่จะใส่ชุดคำสั่งในการประมวลผลโดยตรงเข้าไปในไฟล์ routes/web.php ซึ่งจะทำให้บริหารจัดการลำบาก แนะนำให้แยก โดยแก้ไขให้ส่งไปประมวลผลในส่วน Controller ซึ่งจะทำหน้าที่เชื่อมโยงกับส่วนอื่นๆ เช่น Model, View แล้วค่อยส่งผลที่ได้กลับมายังส่วนการทำ Routing เพื่อแสดงผลลัพธ์กลับไปยังหน้าเว็บอีกที
ในตอนนี้ลองมาดูวิธีการสร้างไฟล์คลาส Controller และการแก้ไขไฟล์ routes/web.php เพื่อส่งการประมวลผลไปยังไฟล์คลาสและเมธอด Controller ที่สร้างไว้
รูปแสดงการเชื่อมโยงระหว่างการเปิดหน้าเว็บ, Routing และ Controller

รันไฟล์ artisan ระบุคำสั่ง make:controller ตามด้วยชื่อคลาส Controller ที่เราต้องการสร้าง ในที่นี้ขอตั้งชื่อคลาสเป็น PageController เพื่อใช้แสดงเว็บเพจหน้าต่างๆ แบบ static
$ php artisan make:controller PageController
Controller created successfully.
ผลลัพธ์ที่ได้จากการรันคำสั่ง make:controller จะได้ไฟล์ในรูปแบบชื่อคลาสตามด้วยนามสกุล .php เช่นจากตัวอย่างด้านบน จะได้ไฟล์ PageController.php ถูกสร้างไว้ในโฟลเดอร์ app/Http/Controllers/ โดยคำสั่ง artisan จะสร้างโครงร่างของไฟล์ (template) สำหรับทำหน้าที่เป็นคลาส Controller
ตัวอย่างไฟล์ app/Http/Controllers/PageController.php ที่ถูกสร้างโดยอัตโนมัติจากการรัน artisan ระบุคำสั่ง make:controller
<?php
// app/Http/Controllers/PageController.php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PageController extends Controller
{
//
}
ขั้นต่อไปสร้างเมธอดชื่อ contact ในไฟล์ PageController.php เพื่อใช้แสดงผลเว็บเพจหน้า contact โดยเบื้องต้นจะมีแค่คำสั่งเดียวในเมธอดนี้คือ ส่งค่ากลับ return เป็นคำว่า Contact Us from Controller
ตัวอย่างการเพิ่มเมธอด contact ในไฟล์ PageController
<?php
// app/Http/Controllers/PageController.php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PageController extends Controller
{
//
public function contact()
{
return 'Contact Us from Controller';
}
}
ลำดับถัดไป คือการแก้ไขไฟล์ Routing คือแทนที่จะพิมพ์คำสั่งเพื่อใช้ประมวลผลไว้ในไฟล์ routes/web.php เลย ก็ให้ส่งค่ามาประมวลผลในส่วน Controller แทน
วิธีการแก้ไขคือ เปลี่ยนพารามิเตอร์ที่ 2 ของคลาสเมธอด Route::get() ให้ระบุเป็นชื่อคลาสและเมธอดในส่วนของ Controller แทน โดยใช้เครื่องหมาย @ คั่นระหว่างชื่อคลาสและเมธอดของ Controller เช่น เราต้องการส่งไปให้คลาสชื่อ PageController โดยเรียกเมธอด contact ก็ระบุพารามิเตอร์ที่ 2 เป็น PageController@contact
ตัวอย่างการแก้ไขไฟล์ routes/web.php เพื่อให้เวลามีการเรียก URI contact ให้ส่งไปประมวลผลที่ Controller แล้วค่อยนำผลลัพธ์ที่ได้ส่งกลับไปแสดงผลผ่านหน้าเว็บอีกที
<?php
// routes/web.php
Route::get('/', function () {
return 'Hello';
});
Route::get('contact', 'PageController@contact');
ทดลองใช้คำสั่ง curl เพื่อทดสอบ ก็จะได้ผลลัพธ์ ที่ส่งมาจากส่วน Controller
$ curl http://blog.test/contact
Contact Us from Controller
ในทำนองเดียวกันเพื่อความเป็นระเบียบของไฟล์ routes/web.php เราสามารถแก้ไขเว็บเพจหน้าแรก / ให้ส่งไปประมวลผลที่ PageController ก่อน ในที่นี้ขอตั้งชื่อเมธอดเป็น home()
แก้ไขไฟล์ PageController โดยเพิ่มเมธอด home()
<?php
// routes/web.php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PageController extends Controller
{
public function home()
{
return 'Hello from Controller';
}
public function contact()
{
return 'Contact Us from Controller';
}
}
แก้ไขไฟล์ routes/web.php เพื่อให้ส่งไปประมวลผลที่ Controller สำหรับเว็บเพจหน้าแรก /
<?php
// routes/web.php
Route::get('/', 'PageController@home');
Route::get('contact', 'PageController@contact');
ทดสอบเข้าเว็บเพจหน้าแรกด้วยคำสั่ง curl
$ curl http://blog.test/
Hello from Controller