PHP / REST API үүсгэх

REST API үүсгэх

Орчин үеийн вэб болон мобайл апп-ууд back-end-тэй REST API-аар харилцдаг. REST (Representational State Transfer) нь URL-д нөөц (resource) тодорхойлж, HTTP аргуудаар (GET, POST, PUT, DELETE) үйлдэл хийдэг архитектурын зарчим юм. Энэ хичээлд цэвэр PHP-д suурилсан бүрэн бэлэн REST API бүтээнэ — фреймворк хэрэггүй, ойлголтууд нь Laravel болон бусад фреймворкт ч адилхан хэрэглэгддэг.

REST-ийн үндсэн зарчмууд

код
GET    /api/хэрэглэгчид          → Бүх хэрэглэгч авах
GET    /api/хэрэглэгчид/1        → 1-р хэрэглэгч авах
POST   /api/хэрэглэгчид          → Шинэ хэрэглэгч үүсгэх
PUT    /api/хэрэглэгчид/1        → 1-р хэрэглэгчийг бүрэн шинэчлэх
PATCH  /api/хэрэглэгчид/1        → 1-р хэрэглэгчийг хэсэгчлэн шинэчлэх
DELETE /api/хэрэглэгчид/1        → 1-р хэрэглэгч устгах

URL нь нөөцийг (юу), HTTP арга нь үйлдлийг (юу хийх) тодорхойлдог.

.htaccess — URL чиглүүлэлт

Apache сервер дээр бүх хүсэлтийг нэг index.php файл руу чиглүүлнэ:

apache
# .htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
php
<?php
// index.php — бүх хүсэлтийг хүлээж авна

header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, PATCH, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(204);
    exit;
}

// URL болон аргыг задлана
$арга = $_SERVER['REQUEST_METHOD'];
$зам  = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$хэсгүүд = array_filter(explode('/', trim($зам, '/')));
$хэсгүүд = array_values($хэсгүүд);

// /api/хэрэглэгчид эсвэл /api/хэрэглэгчид/1
$нөөц = $хэсгүүд[1] ?? null;
$id   = isset($хэсгүүд[2]) ? (int)$хэсгүүд[2] : null;

// Чиглүүлэгч
match(true) {
    $нөөц === 'хэрэглэгчид' => хэрэглэгч_чиглүүлэгч($арга, $id),
    $нөөц === 'бүтээгдэхүүнүүд' => бүтээгдэхүүн_чиглүүлэгч($арга, $id),
    default => api_алдаа("Endpoint олдсонгүй.", 404),
};
?>

Туслах функцууд ба хэрэглэгчийн controller

php
<?php
// Туслах функцууд
function api_хариу(mixed $өгөгдөл, int $статус = 200): never {
    http_response_code($статус);
    echo json_encode($өгөгдөл, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
    exit;
}

function api_алдаа(string $мэдэгдэл, int $статус = 400): never {
    api_хариу(['алдаа' => true, 'мэдэгдэл' => $мэдэгдэл], $статус);
}

function биеийн_өгөгдөл_авах(): array {
    $json = file_get_contents('php://input');
    $өгөгдөл = json_decode($json, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        api_алдаа("Хүчингүй JSON өгөгдөл.");
    }
    return $өгөгдөл ?? [];
}

// Жишээ өгөгдлийн сан (бодит програмд PDO ашиглана)
$хэрэглэгчид_дб = [
    1 => ['id' => 1, 'нэр' => 'Болд',   'имэйл' => 'bold@example.mn',   'нас' => 25],
    2 => ['id' => 2, 'нэр' => 'Сарнай', 'имэйл' => 'sarnai@example.mn', 'нас' => 22],
];

function хэрэглэгч_чиглүүлэгч(string $арга, ?int $id): never {
    global $хэрэглэгчид_дб;

    match($арга) {
        'GET'    => $id ? хэрэглэгч_нэгийг_авах($id) : хэрэглэгч_бүгдийг_авах(),
        'POST'   => хэрэглэгч_үүсгэх(),
        'PUT'    => $id ? хэрэглэгч_шинэчлэх($id) : api_алдаа("id шаардлагатай.", 400),
        'DELETE' => $id ? хэрэглэгч_устгах($id)    : api_алдаа("id шаардлагатай.", 400),
        default  => api_алдаа("Арга зөвшөөрөгдөөгүй.", 405),
    };
}
?>

CRUD endpoint-уудын бүрэн хэрэгжүүлэлт

php
<?php
function хэрэглэгч_бүгдийг_авах(): never {
    global $хэрэглэгчид_дб;

    $жагсаалт = array_values($хэрэглэгчид_дб);
    api_хариу([
        'амжилт' => true,
        'нийт'   => count($жагсаалт),
        'өгөгдөл' => $жагсаалт,
    ]);
}

function хэрэглэгч_нэгийг_авах(int $id): never {
    global $хэрэглэгчид_дб;

    if (!isset($хэрэглэгчид_дб[$id])) {
        api_алдаа("Хэрэглэгч (id: {$id}) олдсонгүй.", 404);
    }

    api_хариу(['амжилт' => true, 'өгөгдөл' => $хэрэглэгчид_дб[$id]]);
}

function хэрэглэгч_үүсгэх(): never {
    global $хэрэглэгчид_дб;

    $өгөгдөл = биеийн_өгөгдөл_авах();

    // Баталгаажуулалт
    $алдаанууд = [];
    if (empty($өгөгдөл['нэр']))    $алдаанууд[] = "Нэр шаардлагатай.";
    if (empty($өгөгдөл['имэйл'])) $алдаанууд[] = "И-мэйл шаардлагатай.";
    if (!empty($өгөгдөл['имэйл']) && !filter_var($өгөгдөл['имэйл'], FILTER_VALIDATE_EMAIL)) {
        $алдаанууд[] = "И-мэйл формат буруу.";
    }

    if (!empty($алдаанууд)) {
        api_хариу(['алдаа' => true, 'алдаанууд' => $алдаанууд], 422);
    }

    // Шинэ ID үүсгэнэ
    $шинэ_id = max(array_keys($хэрэглэгчид_дб)) + 1;
    $шинэ_хэрэглэгч = [
        'id'     => $шинэ_id,
        'нэр'    => trim($өгөгдөл['нэр']),
        'имэйл'  => trim($өгөгдөл['имэйл']),
        'нас'    => isset($өгөгдөл['нас']) ? (int)$өгөгдөл['нас'] : null,
    ];

    $хэрэглэгчид_дб[$шинэ_id] = $шинэ_хэрэглэгч;

    api_хариу(['амжилт' => true, 'өгөгдөл' => $шинэ_хэрэглэгч], 201);
}

function хэрэглэгч_шинэчлэх(int $id): never {
    global $хэрэглэгчид_дб;

    if (!isset($хэрэглэгчид_дб[$id])) {
        api_алдаа("Хэрэглэгч (id: {$id}) олдсонгүй.", 404);
    }

    $өгөгдөл = биеийн_өгөгдөл_авах();
    $хэрэглэгчид_дб[$id] = array_merge($хэрэглэгчид_дб[$id], $өгөгдөл);
    $хэрэглэгчид_дб[$id]['id'] = $id; // id-г хэвээр хадгална

    api_хариу(['амжилт' => true, 'өгөгдөл' => $хэрэглэгчид_дб[$id]]);
}

function хэрэглэгч_устгах(int $id): never {
    global $хэрэглэгчид_дб;

    if (!isset($хэрэглэгчид_дб[$id])) {
        api_алдаа("Хэрэглэгч (id: {$id}) олдсонгүй.", 404);
    }

    unset($хэрэглэгчид_дб[$id]);
    api_хариу(['амжилт' => true, 'мэдэгдэл' => "Хэрэглэгч устгагдлаа."], 200);
}
?>

API-г туршиж үзэх

curl командаар API-г терминалаас туршиж болно:

bash
# GET — бүх хэрэглэгч авах
curl http://localhost/api/хэрэглэгчид

# GET — нэг хэрэглэгч авах
curl http://localhost/api/хэрэглэгчид/1

# POST — шинэ хэрэглэгч үүсгэх
curl -X POST http://localhost/api/хэрэглэгчид \
     -H "Content-Type: application/json" \
     -d '{"нэр":"Тамир","имэйл":"tamir@example.mn","нас":30}'

# PUT — шинэчлэх
curl -X PUT http://localhost/api/хэрэглэгчид/1 \
     -H "Content-Type: application/json" \
     -d '{"нас":26}'

# DELETE — устгах
curl -X DELETE http://localhost/api/хэрэглэгчид/1

Дараагийн хичээлд:

Composer package manager-ийг судална. PHP-н гуравдагч номын сангуудыг хэрхэн суулгаж, autoload-г хэрхэн тохируулдаг, composer.json файлыг хэрхэн бичдгийг жишээгээр үзнэ.