Skip to content

🛣️ Routes & Controllers

ใน Laravel การกำหนดเส้นทาง (Routes) และการควบคุมการทำงาน (Controllers) เป็นหัวใจสำคัญในการสร้าง API


📍 1. API Routes (routes/api.php)

สำหรับ API เราจะทำงานในไฟล์ routes/api.php. ทุก Route ที่ประกาศในไฟล์นี้จะมี prefix /api นำหน้าโดยอัตโนมัติ

รูปแบบการเขียน Route เบื้องต้น

php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\ProductController;

// 1. แบบ Basic Closure (ไม่แนะนำสำหรับงานจริง)
Route::get('/hello', function () {
    return ['message' => 'Hello World'];
});

// 2. แบบเรียกใช้ Controller (แนะนำ)
Route::get('/products', [ProductController::class, 'index']);
Route::post('/products', [ProductController::class, 'store']);
Route::get('/products/{id}', [ProductController::class, 'show']);
Route::put('/products/{id}', [ProductController::class, 'update']);
Route::delete('/products/{id}', [ProductController::class, 'destroy']);

Route Resource (ทางลัด)

แทนที่จะเขียนทีละบรรทัด เราสามารถใช้คำสั่งเดียวเพื่อสร้าง Route ครบทั้ง 5 แบบ (Index, Store, Show, Update, Destroy)

php
Route::apiResource('products', ProductController::class);

ตรวจสอบ Route ทั้งหมดด้วยคำสั่ง:

bash
php artisan route:list

🎮 2. Controllers (app/Http/Controllers)

Controller มีหน้าที่รับ Request จาก Route, ประมวลผล (อาจจะเรียก Model), และส่ง Response กลับไป

สร้าง Controller ด้วย Artisan

bash
php artisan make:controller ProductController --api

Flag --api จะช่วยสร้าง method ที่จำเป็นสำหรับ API ให้โดยอัตโนมัติ (index, store, show, update, destroy)

โครงสร้างภายใน Controller

php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Product; // อย่าลืม import Model

class ProductController extends Controller
{
    // GET /api/products
    public function index()
    {
        return Product::all(); // ส่งข้อมูลทั้งหมดกลับเป็น JSON
    }

    // POST /api/products
    public function store(Request $request)
    {
        // 1. Validate ข้อมูล
        $request->validate([
            'name' => 'required',
            'price' => 'required|numeric'
        ]);

        // 2. บันทึกข้อมูล
        return Product::create($request->all());
    }

    // GET /api/products/{id}
    public function show(string $id)
    {
        return Product::findOrFail($id);
    }

    // PUT /api/products/{id}
    public function update(Request $request, string $id)
    {
        $product = Product::findOrFail($id);
        $product->update($request->all());
        return $product;
    }

    // DELETE /api/products/{id}
    public function destroy(string $id)
    {
        return Product::destroy($id);
    }
}

🛡 3. Validation

Laravel มีระบบตรวจสอบข้อมูลที่ง่ายและทรงพลัง ตัวอย่างการ validate ใน method store:

php
$validated = $request->validate([
    'title' => 'required|max:255',
    'body' => 'required',
    'email' => 'email:rfc,dns'
]);

หากข้อมูลไม่ผ่าน validation Laravel จะส่ง response 422 Unprocessable Entity พร้อมรายละเอียด error กลับไปให้ Frontend โดยอัตโนมัติ ไม่ต้องเขียน if-else เช็คเอง!


📤 4. API Resources (Option เสริม)

ถ้าต้องการปรับแต่งรูปแบบ JSON ก่อนส่งกลับ (เช่น เปลี่ยนชื่อ key หรือซ่อนบาง field) ให้ใช้ API Resource

bash
php artisan make:resource ProductResource

แก้ไขไฟล์ app/Http/Resources/ProductResource.php:

php
public function toArray($request)
{
    return [
        'id' => $this->id,
        'product_name' => $this->name, // เปลี่ยน key
        'price_thb' => number_format($this->price, 2), // จัด format
        // 'created_at' => $this->created_at, // ซ่อนบาง field โดยไม่ใส่
    ];
}

เรียกใช้ใน Controller:

php
use App\Http\Resources\ProductResource;

public function show($id) {
    return new ProductResource(Product::findOrFail($id));
}