Skip to content

🌐 Connect Backend (Fetching Data)

เมื่อเรามี Backend API (Laravel) และ Frontend ที่สวยงาม (React) แล้ว งานสุดท้ายคือการเชื่อมต่อมันเข้าด้วยกัน


1. วิธีดึงข้อมูล (Fetch API)

Browser สมัยใหม่มี fetch() มาให้ในตัว แต่เพื่อให้ง่าย เรามักใช้ Async/Await

ตัวอย่าง: ดึงรายการสินค้าจาก API

jsx
import { useState, useEffect } from 'react';

function ProductList() {
  const [products, setProducts] = useState([]);
  const [loading, setLoading] = useState(true);

  // 1. สร้าง Async Function
  const fetchProducts = async () => {
    try {
      // เรียก API (สมมติว่า backend รันที่ port 8000)
      const response = await fetch('http://localhost:8000/api/products');
      
      // แปลงข้อมูลเป็น JSON
      const data = await response.json();
      
      // เก็บลง State
      setProducts(data);
    } catch (error) {
      console.error("เกิดข้อผิดพลาด:", error);
    } finally {
      setLoading(false); // ปิดการโหลดไม่ว่าจะสำเร็จหรือพัง
    }
  };

  // 2. เรียกใช้ตอนเข้าหน้าเว็บครั้งแรก
  useEffect(() => {
    fetchProducts();
  }, []); // [] สำคัญมาก! เพื่อให้ทำครั้งเดียว

  // 3. แสดงผลหน้าจอ
  if (loading) return <p>กำลังโหลด...</p>;

  return (
    <ul>
      {products.map((product) => (
        <li key={product.id}>
          {product.name} - {product.price} บาท
        </li>
      ))}
    </ul>
  );
}

2. ปัญหา CORS (Cross-Origin Resource Sharing)

เมื่อ Frontend (Port 5173) พยายามคุยกับ Backend (Port 8000) Browser จะมองว่าเป็นคนละแหล่งที่มา (Origin) และบล็อกการทำงานเพื่อความปลอดภัย

วิธีแก้ใน Laravel

เราต้องบอก Laravel ว่า "อนุญาตให้ Frontend นี้เข้ามาได้นะ"

แก้ไขไฟล์ backend/config/cors.php:

php
'paths' => ['api/*', 'sanctum/csrf-cookie'],

'allowed_methods' => ['*'], // อนุญาตทุก Method (GET, POST, PUT, DELETE)

'allowed_origins' => ['http://localhost:5173'], // ใส่ URL ของ React เรา

// หรือถ้าขี้เกียจ (ไม่แนะนำสำหรับ Production)
// 'allowed_origins' => ['*'],

3. การส่งข้อมูลกลับ (POST Method)

ตัวอย่างการทำฟอร์มเพิ่มสินค้า

jsx
const handleSubmit = async (e) => {
  e.preventDefault(); // ป้องกันหน้าเว็บรีเฟรช

  const response = await fetch('http://localhost:8000/api/products', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json', // บอก Server ว่าส่ง JSON นะ
      'Accept': 'application/json'
    },
    body: JSON.stringify({
      name: "สินค้าใหม่",
      price: 999
    })
  });

  if (response.ok) {
    alert("บันทึกสำเร็จ!");
    fetchProducts(); // ดึงข้อมูลใหม่
  } else {
    alert("บันทึกไม่สำเร็จ");
  }
};

ใช้ Library อะไรดี?

ในโปรเจกต์จริง เรามักใช้ Axios หรือ React Query (TanStack Query) เพราะจัดการ Error และ Caching ได้ดีกว่า fetch ธรรมดา แต่สำหรับหลักสูตรนี้ fetch ก็เพียงพอ