2025. április 9., szerda

Laravel 12 -vel REST API - hajomenetrend feladat megoldása

laravel new hajomenetrend

none

mysql

npm rund build

yes

.env ->adatbázis nevet javítsd

php artisan make:model Menetrend

app/Models/Menetrend.php fájl tartalma:

<?php

 

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Menetrend extends Model

{

    protected $table = 'menetrend';

    protected $primaryKey = 'azon';

    public $timestamps = false;

    protected $fillable = ['jarat', 'honnan', 'hova', 'indul', 'erkezik'];

}

php artisan make:controller MenetrendController –api

app/Http/Controllers/MenetrendController.php:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Models\Menetrend;

class MenetrendController extends Controller

{

    public function index()

    {

        return Menetrend::all();

    }

    public function store(Request $request)

    {

try {

        $menet = Menetrend::create($request->only(['jarat', 'honnan', 'hova', 'indul', 'erkezik']));

        return response()->json($menet, 201);

    } catch (\Exception $e) {

        return response()->json(['error' => $e->getMessage()], 500);

    }    }

 

    public function show($azon)

    {

        return Menetrend::findOrFail($azon);

    }

 

    public function update(Request $request, $azon)

    {

        $menetrend = Menetrend::findOrFail($azon);

        $menetrend->update($request->only(['jarat', 'honnan', 'hova', 'indul', 'erkezik']));

        return response()->json($menetrend);

    }

 

    public function destroy($azon)

    {

        Menetrend::destroy($azon);

        return response()->json(['message' => 'Törölve']);

    }

}

php artisan install:api

routes/api.php fájlba:

use App\Http\Controllers\MenetrendController;

Route::apiResource('menetrend', MenetrendController::class);

Teszt:

php artisan serve

GET /api/menetrend – összes hajójárat

GET /api/menetrend/1 – 1 járat

POST /api/menetrend – új járat

{

  "jarat": "B55",

  "honnan": "Tihany",

  "hova": "Balatonfüred",

  "indul": "12:00:00",

  "erkezik": "12:45:00"

}

PUT /api/menetrend/1 – módosítás

DELETE /api/menetrend/1 – törlés

a hajómenetrend táblához hozzá kell adni, mivel az azon nem auto increment

ALTER TABLE menetrend MODIFY COLUMN azon INT NOT NULL AUTO_INCREMENT;

Laravel 12 REST API - ez jó

norway_info adatbázishoz van elkészítve

Amire szükség van hozzá:

PHP >= 8.2

Node >= 18.18.2

NPM >= 9.8.1

Composer >= 2.8.6

Laravel Installer >= 5.12.2

ellenőrizd milyen verziód van : composer self-update

pl. Composer version 2.8.8 – ez jó

ha nem akkor :

composer global remove laravel/installer

composer global update

composer global require laravel/installer

mehet mindhárom parancs egyszerre, lefrissíti

hozd létre az új projektet:

laravel new laravel-12-rest-api

amikor választani kell, hogy none, react, vue, livewire, válaszd a none-t.

none

az adatbázisoknál a mysql-t

mysql

állítsd be a .env fájlban az adatbázisod nevét

php artisan make:model Content –migration

állítsd be a database/migrations-ben a táblád adatait

$table->id();

$table->string('title');

$table->string('body');

$table->string('img');

$table->timestamps();

csináld meg a migrálást

php artisan migrate

Jetstream helyett így tudjuk létrehozni az api.php-t:

php artisan install:api

Controllert létrehozása:

php artisan make:controller ContentController –api

ahol szükséges egészítsd ki:

namespace App\Http\Controllers;

use App\Models\Content;

use Illuminate\Http\Request;

use App\Http\Controllers\Controller;

 

class ContentController extends Controller

{

    public function index()

    {

        //return response()->json(Content::all());

        $contents = Content::get();

        return response()->json($contents);

    }

 

    public function store(Request $request)

    {

        /*$content = Content::create($request->only(['title', 'body', 'img']));

        return response()->json($content, 201);*/

 

        $content = new Content();

        $content->title = $request->title;

        $content->body = $request->body;

        $content->img = $request->img;

        $content->save();

        return response()->json($content);

    }

 

    public function show(string $id)

    {

        $content = Content::findOrFail($id);

        return response()->json($content);

 

       

    }

 

    public function update(Request $request, string $id)

    {

        $content = Content::findOrFail($id);

        $content->update($request->only(['title', 'body', 'img']));

        return response()->json($content);

    }

 

    public function destroy(string $id)

    {

        Content::destroy($id);

        return response()->json(['message' => 'Törölve']);

    }

}

egészítsük ki az routes/api.php fájlunkat:

use Illuminate\Http\Request;

use Illuminate\Support\Facades\Route;

use App\Http\Controllers\ContentController;

Route::get('/user', function (Request $request) {

    return $request->user();

})->middleware('auth:sanctum');

Route::apiResource('contents', ContentController::class);

mehet a tesztelés:

php artisan serve

link /api/contents 

php artisan route:list -> útvonalak végpontok

REST API PHP

 Procedurális módszerrel:

<?php

// Adatbázis kapcsolat beállításai

$host = 'localhost';

$user = 'root';

$password = '';

$dbname = 'norway_info';

 

// Kapcsolat létrehozása

$conn = new mysqli($host, $user, $password, $dbname);

 

// Kapcsolat ellenőrzése

if ($conn->connect_error) {

    die("Sikertelen kapcsolat: " . $conn->connect_error);

}

 

// Karakterkódolás beállítása

$conn->set_charset("utf8mb4");

header('Content-Type: application/json; charset=utf-8');

 

$method = $_SERVER['REQUEST_METHOD'];

$id = isset($_GET['id']) ? intval($_GET['id']) : null;

 

// JSON input feldolgozása

$inputJSON = file_get_contents('php://input');

$input = json_decode($inputJSON, true);

 

// fallback ha nem JSON jött

if (!is_array($input)) {

    $input = $_POST;

}

 

switch ($method) {

    case 'GET':

        if ($id) {

            $stmt = mysqli_prepare($conn, "SELECT * FROM contents WHERE id = ?");

            mysqli_stmt_bind_param($stmt, "i", $id);

            mysqli_stmt_execute($stmt);

            $result = mysqli_stmt_get_result($stmt);

            $data = mysqli_fetch_assoc($result);

        } else {

            $result = mysqli_query($conn, "SELECT * FROM contents");

            $data = mysqli_fetch_all($result, MYSQLI_ASSOC);

        }

        echo json_encode($data, JSON_UNESCAPED_UNICODE);

        break;

 

    case 'POST':

        if (!isset($input['title']) || !isset($input['body'])) {

            http_response_code(400);

            echo json_encode(['error' => 'title és body mező kötelező']);

            exit;

        }

        $title = $input['title'];

        $body = $input['body'];

        $img = isset($input['img']) ? $input['img'] : '';

 

        $stmt = mysqli_prepare($conn, "INSERT INTO contents (title, body, img) VALUES (?, ?, ?)");

        mysqli_stmt_bind_param($stmt, "sss", $title, $body, $img);

        mysqli_stmt_execute($stmt);

        echo json_encode(['id' => mysqli_insert_id($conn)]);

        break;

 

    case 'PUT':

        if (!$id) {

            http_response_code(400);

            echo json_encode(['error' => 'ID szükséges']);

            exit;

        }

        if (!isset($input['title']) || !isset($input['body'])) {

            http_response_code(400);

            echo json_encode(['error' => 'title és body mező kötelező']);

            exit;

        }

        $title = $input['title'];

        $body = $input['body'];

        $img = isset($input['img']) ? $input['img'] : '';

 

        $stmt = mysqli_prepare($conn, "UPDATE contents SET title=?, body=?, img=? WHERE id=?");

        mysqli_stmt_bind_param($stmt, "sssi", $title, $body, $img, $id);

        mysqli_stmt_execute($stmt);

        echo json_encode(['updated' => mysqli_stmt_affected_rows($stmt)]);

        break;

 

    case 'DELETE':

        if (!$id) {

            http_response_code(400);

            echo json_encode(['error' => 'ID szükséges']);

            exit;

        }

 

        $stmt = mysqli_prepare($conn, "DELETE FROM contents WHERE id=?");

        mysqli_stmt_bind_param($stmt, "i", $id);

        mysqli_stmt_execute($stmt);

        echo json_encode(['deleted' => mysqli_stmt_affected_rows($stmt)]);

        break;

 

    default:

        http_response_code(405);

        echo json_encode(['error' => 'Nem támogatott HTTP metódus']);

}

Egy másik megoldással:

$method = $_SERVER['REQUEST_METHOD'];

 

// PUT és DELETE esetén a nyers input feldolgozása

parse_str(file_get_contents("php://input"), $input);

 

$id = $_GET['id'] ?? null;

 

switch ($method) {

    case 'GET':

        if ($id) {

            $stmt = $conn->prepare("SELECT * FROM contents WHERE id = ?");

            $stmt->bind_param("i", $id);

        } else {

            $stmt = $conn->prepare("SELECT * FROM contents");

        }

        $stmt->execute();

        $result = $stmt->get_result();

        $data = $id ? $result->fetch_assoc() : $result->fetch_all(MYSQLI_ASSOC);

        echo json_encode($data, JSON_UNESCAPED_UNICODE);

        break;

 

    case 'POST':

        $title = $_POST['title'] ?? '';

        $body = $_POST['body'] ?? '';

        $img = $_POST['img'] ?? '';

        $stmt = $conn->prepare("INSERT INTO contents (title, body, img) VALUES (?, ?, ?)");

        $stmt->bind_param("sss", $title, $body, $img);

        $stmt->execute();

        echo json_encode(['id' => $stmt->insert_id]);

        break;

 

    case 'PUT':

        if (!$id) {

            http_response_code(400);

            echo json_encode(['error' => 'ID szükséges']);

            exit;

        }

        $title = $input['title'] ?? '';

        $body = $input['body'] ?? '';

        $img = $input['img'] ?? '';

        $stmt = $conn->prepare("UPDATE contents SET title=?, body=?, img=? WHERE id=?");

        $stmt->bind_param("sssi", $title, $body, $img, $id);

        $stmt->execute();

        echo json_encode(['updated' => $stmt->affected_rows]);

        break;

 

    case 'DELETE':

        if (!$id) {

            http_response_code(400);

            echo json_encode(['error' => 'ID szükséges']);

            exit;

        }

        $stmt = $conn->prepare("DELETE FROM contents WHERE id=?");

        $stmt->bind_param("i", $id);

        $stmt->execute();

        echo json_encode(['deleted' => $stmt->affected_rows]);

        break;

 

    default:

        http_response_code(405);

        echo json_encode(['error' => 'Nem támogatott metódus']);

}

2025. április 7., hétfő

Norway_info Laravel REST API Jetstreammel (Livewire + MySQL)

Készítsünk egy olyan Laravel REST API-t, amely egy contents nevű adatbázistábla adatait kezeli (Create, Read, Update, Delete), és amelyet Postmanből, vagy ECHO API-val lehet tesztelni autentikáció vagyis bejelentkezés nélkül.

Jetstream ajánlott, mert automatikusan létrehozza az api.php fájlt, és beállítja a projektet fejlesztésre. Ha nem szeretnél bejelentkezést, azt egyszerűen kihagyjuk a kódodból.

Telepíts egy új projektet: laravel new norway_info

válaszd ki a jetstream, livewire, mysql, és migrálás lehetőségeket. Ha valamit kihagysz utólag is telepítheted: 

cd norway_info

composer require laravel/jetstream

php artisan jetstream:install livewire

npm install && npm run dev

php artisan migrate

Jetstream + Livewire beállítja az alapstruktúrát, de az autentikációs middleware-t nem fogjuk használni az API route-oknál, mert az nem feladat jelen esetben.

Adatmodell létrehozása: 

php artisan make:model Content

A modellbe engedélyezzük a mezők tömeges kitöltését:

// app/Models/Content.php

protected $fillable = ['title', 'body', 'img'];

API Resource létrehozása:

php artisan make:resource ContentResource

A resource formázza az adatokat JSON-válaszként:

// app/Http/Resources/ContentResource.php

namespace App\Http\Resources;

use Illuminate\Http\Request;

use Illuminate\Http\Resources\Json\JsonResource;

class ContentResource extends JsonResource

{

    public function toArray(Request $request): array

    {

        return [

            'id'         => $this->id,

            'title'      => $this->title,

            'body'       => $this->body,

            'img'        => $this->img,

            'created_at' => $this->created_at,

        ];

    }

}

Controller létrehozása REST API-hoz:

php artisan make:controller ContentController - -api

// app/Http/Controllers/ContentController.php

namespace App\Http\Controllers;

use App\Models\Content;

use Illuminate\Http\Request;

use App\Http\Resources\ContentResource;

class ContentController extends Controller

{

    // 🟢 READ – Összes tartalom lekérdezése

    public function index()

    {

        return ContentResource::collection(Content::all());

    }

    // 🟢 CREATE – Új tartalom létrehozása

    public function store(Request $request)

    {

        $validated = $request->validate([

            'title' => 'required|string|max:255',

            'body'  => 'required|string',

            'img'   => 'nullable|string|max:255',

        ]);

        $content = Content::create($validated);

        return new ContentResource($content);

    }

    // 🟢 READ – Egy adott tartalom lekérdezése

    public function show($id)

    {

        return new ContentResource(Content::findOrFail($id));

    }

    // 🟡 UPDATE – Tartalom frissítése

    public function update(Request $request, $id)

    {

        $content = Content::findOrFail($id);

        $validated = $request->validate([

            'title' => 'sometimes|required|string|max:255',

            'body'  => 'sometimes|required|string',

            'img'   => 'nullable|string|max:255',

        ]);

        $content->update($validated);

        return new ContentResource($content);

    }

    // 🔴 DELETE – Tartalom törlése

    public function destroy($id)

    {

        $content = Content::findOrFail($id);

        $content->delete();

        return response()->json(['message' => 'Deleted successfully']);

    }

}

API útvonal hozzáadása (route)

// routes/api.php

use Illuminate\Support\Facades\Route;

use App\Http\Controllers\ContentController;

Route::apiResource('contents', ContentController::class);

Szerver indítás:

php artisan serve

URL: http://127.0.0.1:8000/api/contents

Post teszthez:

{

  "title": "Norvég Oktatás",

  "body": "Az oktatási rendszer ingyenes és magas színvonalú.",

  "img": "education.jpg"

}

Mi van, ha sessions hibát kapok?
Állítsd .env fájlban: SESSION_DRIVER=file
Majd: php artisan config:clear

Nem jön létre api.php?
Hozd létre kézzel: routes/api.php
Laravel automatikusan betölti.

MűveletHTTPVégpont
ListázásGET/api/contents
Egy lekérdezésGET/api/contents/{id}
LétrehozásPOST/api/contents
MódosításPUT/api/contents/{id}
TörlésDELETE/api/contents/{id}

Laravel 12 -vel REST API - hajomenetrend feladat megoldása

laravel new hajomenetrend none mysql npm rund build yes .env ->adatbázis nevet javítsd php artisan make:model Menetrend app...