จากการ คอนฟิก 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