Laravel 7 : สร้างคลาส Controller สำหรับประมวลผล

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

ในตอนนี้ลองมาดูวิธีการสร้างไฟล์คลาส Controller และการแก้ไขไฟล์ routes/web.php เพื่อส่งการประมวลผลไปยังไฟล์คลาสและเมธอด Controller ที่สร้างไว้

รูปแสดงการเชื่อมโยงระหว่างการเปิดหน้าเว็บ, Routing และ Controller

Laravel 7 Route Controller Flow

สร้างไฟล์คลาส 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 ให้ส่งไปยัง 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

ข้อมูลเพิ่มเติม