แนวคิดที่คุณใช้ในการแยก 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 ช่วยให้การพัฒนาแอปพลิเคชันมีความยืดหยุ่นและง่ายต่อการจัดการ การออกแบบให้แต่ละส่วนรับผิดชอบงานเฉพาะของตัวเองทำให้โค้ดเข้าใจง่าย และลดการพึ่งพาระหว่างส่วนต่าง ๆ
ข้อดีของการแยกหน้าที่:
- โค้ดสะอาด (Clean Code):
- การแยกตรรกะทางธุรกิจ (Business Logic) ไว้ใน Model ทำให้ Controller มีหน้าที่เฉพาะการจัดการ Request และ Response และ View มีหน้าที่แสดงผล
- ง่ายต่อการดูแลและขยายระบบ:
- หากต้องการปรับเปลี่ยนการ Query ข้อมูล คุณสามารถแก้ไขใน Model ได้โดยไม่กระทบ Controller หรือ View
- รองรับการทดสอบ (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>
หลักการเพิ่มเติมที่ช่วยปรับปรุงโค้ด
- ใช้ Repository หรือ Service Layer:
- หากตรรกะใน Model เริ่มซับซ้อน คุณสามารถแยกการจัดการข้อมูลไปไว้ใน Repository หรือ Service Layer เพื่อความเป็นระเบียบ
- Form Request สำหรับ Validation:
- ย้ายการตรวจสอบข้อมูลจาก Controller ไปไว้ใน Form Request เพื่อรักษาความสะอาดของโค้ด
- ใช้ Eloquent Relationships:
- กำหนดความสัมพันธ์ระหว่าง Model เช่น One-to-Many หรือ Many-to-Many เพื่อให้ Query ข้อมูลง่ายขึ้น
แหล่งข้อมูลอ้างอิง
- Laravel Documentation: https://laravel.com/docs
- Laracasts – Laravel Tutorials: https://laracasts.com
- Medium – Best Practices for Laravel Development: https://medium.com
- Stack Overflow – Laravel Discussions: https://stackoverflow.com/questions/tagged/laravel
สรุป
การแยกหน้าที่ระหว่าง Model, Controller และ View ใน Laravel เป็นแนวคิดที่ช่วยให้โค้ดมีโครงสร้างที่ดีและง่ายต่อการดูแล โดย:
- Model: จัดการข้อมูลและตรรกะที่เกี่ยวข้องกับฐานข้อมูล
- Controller: รับคำสั่งจากผู้ใช้และส่งข้อมูลไปยัง View
- View: แสดงผลข้อมูลให้ผู้ใช้
ด้วยหลักการเหล่านี้ คุณสามารถพัฒนาเว็บแอปพลิเคชันที่มีประสิทธิภาพและรองรับการขยายตัวในอนาคตได้อย่างง่ายดาย
Share this content: