Laravel - React - Api kapcsolat

 Hogyan kell megalkotni egy kapcsolatot a Laravel és a React között



## 1. Fázis: Backend (Laravel 12) Alapozás

1. Projekt létrehozása:

composer create-project laravel/laravel todo-backend 

cd todo-backend


2. Adatbázis beállítása: .env fájl szerkesztése


DB_DATABASE=todo_db

DB_USERNAME=root

DB_PASSWORD= (vagy a jelszavad)

3. API képesség telepítése (Laravel 11/12 specifikus):

php artisan install:api

4. Model és Migráció:

    
php artisan make:model Todo -m

    $table->id();

    $table->string('title');

    $table->boolean('completed')->default(false);

    $table->timestamps();

Futtasd: `php artisan migrate`

5. **A Modell javítása (Mass Assignment - A 500-as hiba ellen):**

Nyisd meg az `app/Models/Todo.php` fájlt:

    protected $fillable = ['title', 'completed'];

## 2. Fázis: Logika és Útvonalak

6.  **Kontroller létrehozása:**

    `php artisan make:controller TodoController`

   

Az `app/Http/Controllers/TodoController.php` tartalma:

    public function index() { return Todo::all(); }

    public function store(Request $request) { return Todo::create($request->all()); }

    public function destroy(Todo $todo) { $todo->delete(); }

 

7.  **API Útvonalak rögzítése:**

    A `routes/api.php` fájlban:

    use App\Http\Controllers\TodoController;

    Route::apiResource('todos', TodoController::class);

   

 

8.  **CORS hiba feloldása:**

    Futtasd: `php artisan config:publish cors`

    A `config/cors.php` fájlban:

    'allowed_origins' => ['*'],

 

 

## 3. Fázis: Frontend (React + Vite)

 

9.  **Projekt létrehozása (külön mappában):**

    `npm create vite@latest todo-frontend -- --template react`

    `cd todo-frontend`

    `npm install`

    `npm install axios`

 

10. **A Frontend kód megírása:**

    Az `src/App.jsx` fájlban a kapcsolat kiépítése:

   

    import { useState, useEffect } from 'react';

    import axios from 'axios';

 

    const api = axios.create({ baseURL: 'http://127.0.0.1:8000/api' });

 

    function App() {

      const [todos, setTodos] = useState([]);

      const [text, setText] = useState("");

 

      useEffect(() => { fetchTodos(); }, []);

 

      const fetchTodos = async () => {

        const res = await api.get('/todos');

        setTodos(res.data);

      };

 

      const handleAdd = async () => {

        if (!text) return;

        const res = await api.post('/todos', { title: text });

        setTodos([...todos, res.data]);

        setText("");

      };

 

      const handleDelete = async (id) => {

        await api.delete(`/todos/${id}`);

        setTodos(todos.filter(t => t.id !== id));

      };

 

      return (

        <div>

          <input value={text} onChange={(e) => setText(e.target.value)} />

          <button onClick={handleAdd}>Hozzáad</button>

          <ul>

            {todos.map(t => (

              <li key={t.id}>{t.title} <button onClick={() => handleDelete(t.id)}>X</button></li>

            ))}

          </ul>

        </div>

      );

    }

    export default App;

 

 

## 4. Fázis: Futtatás

 

11. **Szerverek indítása:**

    *   **Terminál 1 (Backend):** `php artisan serve`

    *   **Terminál 2 (Frontend):** `npm run dev`