การแยก Model, Controller และ View ใน Laravel อย่างมีประสิทธิภาพ

เริ่มต้นเส้นทางกับ Laravel: คู่มือสำหรับผู้เริ่มต้น

แนวคิดที่คุณใช้ในการแยก Model สำหรับ Query ข้อมูล และ Controller สำหรับ Request – Response ใน Laravel และ View สำหรับแสดงผล

การพัฒนาแอปพลิเคชันด้วย Laravel มีพื้นฐานสำคัญที่ยึดตามแนวคิด MVC (Model-View-Controller) ซึ่งเป็นสถาปัตยกรรมที่ช่วยจัดการโครงสร้างของโค้ดให้ชัดเจน แยกหน้าที่แต่ละส่วนออกจากกันอย่างเหมาะสม ทั้งนี้ การแยก Model และ Controller อย่างถูกต้องจะช่วยให้โค้ดสะอาด ดูแลง่าย และขยายต่อได้ในอนาคต


Model: ส่วนที่รับผิดชอบการจัดการข้อมูล

Model ใน Laravel ทำหน้าที่เป็นตัวกลางระหว่างฐานข้อมูลกับแอปพลิเคชัน โดย Model ใช้สำหรับจัดการข้อมูล เช่น การสร้าง อ่าน อัปเดต และลบ (CRUD: Create, Read, Update, Delete) รวมถึงการกำหนดความสัมพันธ์ของข้อมูลและตรรกะที่เกี่ยวข้องกับข้อมูล

ตัวอย่างการสร้าง Model:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    protected $fillable = ['name', 'price', 'description']; // ฟิลด์ที่อนุญาตให้เพิ่มหรือแก้ไขได้

    // ฟังก์ชันสำหรับ Query ข้อมูลเพิ่มเติม
    public static function getExpensiveProducts($price)
    {
        return self::where('price', '>', $price)->get();
    }
}

ในตัวอย่างนี้ Model ของ Product มีหน้าที่จัดการข้อมูลสินค้าทั้งหมด ไม่ว่าจะเป็นการบันทึกข้อมูลใหม่หรือ Query ข้อมูลที่มีอยู่ เช่น การดึงสินค้าที่มีราคาสูงกว่าจำนวนที่กำหนดไว้


Controller: ตัวกลางระหว่างผู้ใช้และแอปพลิเคชัน

Controller ทำหน้าที่รับ Request จากผู้ใช้ และส่งต่อคำสั่งให้ Model ทำงาน จากนั้นรวบรวมผลลัพธ์เพื่อเตรียม Response ให้กับผู้ใช้ การทำงานนี้ช่วยให้โค้ดใน Controller กระชับ เน้นเฉพาะการจัดการ Request และ Response

ตัวอย่างการสร้าง Controller:

<?php

namespace App\Http\Controllers;

use App\Models\Product;
use Illuminate\Http\Request;

class ProductController extends Controller
{
    public function index()
    {
        // ใช้ Model เพื่อ Query ข้อมูล
        $products = Product::all();

        // ส่งข้อมูลไปยัง View
        return view('products.index', compact('products'));
    }

    public function show($id)
    {
        // ดึงข้อมูลสินค้าตาม ID
        $product = Product::findOrFail($id);

        // ส่งข้อมูลไปยัง View
        return view('products.show', compact('product'));
    }
}

ในตัวอย่างนี้ Controller ของ Product ใช้ฟังก์ชันใน Model เพื่อดึงข้อมูลสินค้า และส่งข้อมูลไปยัง View เพื่อแสดงผล การจัดการข้อมูลทั้งหมดถูกผลักไปอยู่ใน Model เพื่อรักษาความสะอาดของโค้ดใน Controller


View: ส่วนที่แสดงผลข้อมูลให้กับผู้ใช้

View ใน Laravel ทำหน้าที่รับข้อมูลจาก Controller และแสดงผลในรูปแบบ HTML หรือส่วนติดต่อผู้ใช้ (UI) โดยใช้ Blade Template Engine ซึ่งช่วยให้การเขียนโค้ดใน View ง่ายและยืดหยุ่นมากขึ้น

ตัวอย่างการสร้าง View:

<!-- resources/views/products/index.blade.php -->
<h1>รายการสินค้า</h1>
<ul>
    @foreach ($products as $product)
        <li>
            <a href="{{ route('products.show', $product->id) }}">
                {{ $product->name }} - ฿{{ $product->price }}
            </a>
        </li>
    @endforeach
</ul>

ในตัวอย่างนี้ View ใช้แสดงรายการสินค้าจากข้อมูลที่ส่งมาจาก Controller โดยใช้ Blade Syntax เช่น @foreach เพื่อแสดงผลข้อมูลเป็นรายการ

View สำหรับแสดงรายละเอียดสินค้า:

<!-- resources/views/products/show.blade.php -->
<h1>{{ $product->name }}</h1>
<p>ราคา: ฿{{ $product->price }}</p>
<p>{{ $product->description }}</p>
<a href="{{ route('products.index') }}">กลับไปหน้ารายการสินค้า</a>

ใน View นี้จะแสดงรายละเอียดของสินค้าเฉพาะชิ้น โดยดึงข้อมูลจากตัวแปร $product ที่ส่งมาจาก Controller


การแยกหน้าที่ระหว่าง Model, Controller และ View

การแยกหน้าที่ของ Model, Controller และ View ช่วยให้การพัฒนาแอปพลิเคชันมีความยืดหยุ่นและง่ายต่อการจัดการ การออกแบบให้แต่ละส่วนรับผิดชอบงานเฉพาะของตัวเองทำให้โค้ดเข้าใจง่าย และลดการพึ่งพาระหว่างส่วนต่าง ๆ

ข้อดีของการแยกหน้าที่:

  1. โค้ดสะอาด (Clean Code):
    • การแยกตรรกะทางธุรกิจ (Business Logic) ไว้ใน Model ทำให้ Controller มีหน้าที่เฉพาะการจัดการ Request และ Response และ View มีหน้าที่แสดงผล
  2. ง่ายต่อการดูแลและขยายระบบ:
    • หากต้องการปรับเปลี่ยนการ Query ข้อมูล คุณสามารถแก้ไขใน Model ได้โดยไม่กระทบ Controller หรือ View
  3. รองรับการทดสอบ (Testability):
    • คุณสามารถเขียน Unit Test สำหรับ Model และ Controller แยกจากกัน และทำการทดสอบ View แยกส่วนได้

ตัวอย่างการใช้งานจริง

สมมติว่าคุณต้องการแสดงสินค้าทั้งหมดที่มีราคาสูงกว่า 1,000 บาท และส่งข้อมูลไปยัง View เพื่อแสดงผล

Model:

public static function getExpensiveProducts($price)
{
    return self::where('price', '>', $price)->get();
}

Controller:

public function expensive()
{
    $products = Product::getExpensiveProducts(1000);
    return view('products.expensive', compact('products'));
}

View:

<!-- resources/views/products/expensive.blade.php -->
<h1>สินค้าราคาสูง</h1>
<ul>
    @foreach ($products as $product)
        <li>{{ $product->name }} - ฿{{ $product->price }}</li>
    @endforeach
</ul>

หลักการเพิ่มเติมที่ช่วยปรับปรุงโค้ด

  1. ใช้ Repository หรือ Service Layer:
    • หากตรรกะใน Model เริ่มซับซ้อน คุณสามารถแยกการจัดการข้อมูลไปไว้ใน Repository หรือ Service Layer เพื่อความเป็นระเบียบ
  2. Form Request สำหรับ Validation:
    • ย้ายการตรวจสอบข้อมูลจาก Controller ไปไว้ใน Form Request เพื่อรักษาความสะอาดของโค้ด
  3. ใช้ Eloquent Relationships:
    • กำหนดความสัมพันธ์ระหว่าง Model เช่น One-to-Many หรือ Many-to-Many เพื่อให้ Query ข้อมูลง่ายขึ้น

แหล่งข้อมูลอ้างอิง

  1. Laravel Documentation: https://laravel.com/docs
  2. Laracasts – Laravel Tutorials: https://laracasts.com
  3. Medium – Best Practices for Laravel Development: https://medium.com
  4. Stack Overflow – Laravel Discussions: https://stackoverflow.com/questions/tagged/laravel

สรุป

การแยกหน้าที่ระหว่าง Model, Controller และ View ใน Laravel เป็นแนวคิดที่ช่วยให้โค้ดมีโครงสร้างที่ดีและง่ายต่อการดูแล โดย:

  • Model: จัดการข้อมูลและตรรกะที่เกี่ยวข้องกับฐานข้อมูล
  • Controller: รับคำสั่งจากผู้ใช้และส่งข้อมูลไปยัง View
  • View: แสดงผลข้อมูลให้ผู้ใช้

ด้วยหลักการเหล่านี้ คุณสามารถพัฒนาเว็บแอปพลิเคชันที่มีประสิทธิภาพและรองรับการขยายตัวในอนาคตได้อย่างง่ายดาย

Share this content:

Leave a Comment

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

Scroll to Top
Verified by MonsterInsights