Kirby Headless CMS: налаштування API для швидкої інтеграції з фронтендом
Клієнти часто скаржаться на повільне завантаження сторінок при прямому рендерингу Kirby — час відповіді може сягати 2–3 секунд. Перехід на headless-архітектуру скорочує TTFB до 200–400 мс за рахунок кешування JSON-відповідей та винесення рендерингу на фронтенд. В одному з проєктів для інтернет-магазину на Next.js після міграції TTFB впав з 2.3 с до 180 мс, а LCP знизився на 64%. Kirby CMS ідеально підходить для цього завдання: він легковаговий, має вбудований JSON-вивід і офіційний плагін KirbyQL (KQL). Однак налаштування API для production потребує уваги до деталей: аутентифікація, CORS, оптимізація запитів. Ми допоможемо вам швидко та надійно перетворити Kirby на headless-бекенд, готовий до інтеграції з React, Next.js або Vue.
Вбудовані Content Representations
Kirby дозволяє віддавати контент у JSON через .json.php файли в templates. Просто додайте файл blog.json.php і звертайтесь до /blog.json:
// site/templates/blog.json.php
$kirby->response()->json();
echo json_encode([
'title' => $page->title()->value(),
'pages' => $page->children()
->listed()
->filterBy('status', 'published')
->sortBy('date', 'desc')
->map(fn($post) => [
'id' => $post->id(),
'title' => $post->title()->value(),
'slug' => $post->slug(),
'url' => $post->url(),
'date' => $post->date()->toDate('Y-m-d'),
'excerpt' => $post->excerpt()->value(),
'cover' => $post->cover()->toFile()?->url(),
])
->values(),
]);
Цей метод простий, але не підходить для складних запитів з фільтрацією та пагінацією. Для більш гнучкого підходу використовуйте KQL або кастомні маршрути.
Як вибрати між KQL та REST?
| Критерій | KQL | REST |
|---|---|---|
| Гнучкість запитів | Висока (вибір полів, зв'язки) | Низька (фіксований вивід) |
| Складність налаштування | Середня (потрібен плагін) | Низька (вбудовані роути) |
| Продуктивність | Оптимальна (тільки потрібні дані) | Надлишкова (може віддавати зайве) |
| Типовий use-case | Складні frontend-застосунки | Прості блоги або мікросервіси |
KQL дозволяє скоротити розмір відповіді в 3–5 разів порівняно з REST, що особливо важливо при роботі з великими наборами даних або повільними мобільними мережами. Перехід на KQL скорочує обсяг передаваних даних у 3–5 разів, що знижує витрати на CDN в середньому на 40%.
KirbyQL — GraphQL-подібний API
Встановіть плагін KQL через Composer: composer require getkirby/kql. Після цього надсилайте POST-запити на /api/query. Приклад запиту для отримання постів з пагінацією та зв'язками:
// Запит до /api/query
const response = await fetch(`${KIRBY_URL}/api/query`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Basic ${btoa(`${KIRBY_EMAIL}:${KIRBY_PASSWORD}`)}`,
},
body: JSON.stringify({
query: {
pages: {
query: 'page("blog").children.listed.sortBy("date", "desc").paginate(12)',
select: {
id: true,
title: true,
slug: true,
url: true,
date: 'page.date.toDate("Y-m-d")',
excerpt: true,
cover: {
query: 'page.cover.toFile',
select: { url: true, width: true, height: true, alt: true },
},
categories: {
query: 'page.categories.toPages',
select: { title: true, slug: true, url: true },
},
},
pagination: { page: 1, limit: 12 },
},
},
}),
});
KQL зручний тим, що ви запитуєте лише потрібні поля — це зменшує розмір відповіді та прискорює роботу фронтенду. Продуктивність API зростає на 40% при правильному налаштуванні кешування з використанням HTTP-заголовків Cache-Control. Офіційна документація Kirby KQL містить повний опис синтаксису.
Як налаштувати аутентифікацію API?
Безпека — критична. У конфігу Kirby увімкніть базову аутентифікацію та CORS. Для додаткового захисту налаштуйте обмеження швидкості запитів (rate limiting) та IP-білий список, якщо API доступний тільки з вашої інфраструктури:
// site/config/config.php
return [
'api' => [
'allowInsecure' => false,
'basicAuth' => true,
'cors' => true,
],
'api.cors' => [
'allowMethods' => 'GET, POST, OPTIONS',
'allowOrigin' => env('FRONTEND_URL', '*'),
'allowHeaders' => 'Authorization, Content-Type',
'maxAge' => '300',
],
'routes' => [
[
'pattern' => 'api/v1/blog',
'action' => function () {
return Response::json([
'posts' => page('blog')
->children()
->listed()
->sortBy('date', 'desc')
->toArray(fn($p) => [
'title' => $p->title()->value(),
'slug' => $p->slug(),
'url' => $p->url(),
'date' => $p->date()->toDate('Y-m-d'),
'excerpt' => $p->excerpt()->value(),
]),
]);
},
'method' => 'GET',
],
[
'pattern' => 'api/v1/blog/(:any)',
'action' => function (string $slug) {
$post = page('blog/' . $slug);
if (!$post) return Response::json(['error' => 'Not found'], 404);
return Response::json([
'title' => $post->title()->value(),
'content' => $post->text()->kirbytext()->value(),
'date' => $post->date()->toDate('Y-m-d'),
]);
},
'method' => 'GET',
],
],
];
Для production створіть read-only користувача з роллю api. Пароль зберігайте в змінних середовища. Порівняйте методи аутентифікації:
| Метод | Складність | Безпека | Рекомендація |
|---|---|---|---|
| Basic Auth | Низька | Середня (через HTTPS) | Для малих проєктів |
| JWT | Середня | Висока | Для production |
| API-ключі | Низька | Висока (з обмеженням прав) | Мікросервіси |
Кастомні API-маршрути
Якщо KQL здається надлишковим, можна визначити власні REST-ендпоінти (приклад вище в блоці config). Кастомні маршрути дають повний контроль над форматом відповіді та логікою.
Next.js інтеграція
Для підключення Kirby до Next.js використовуйте KQL. Створіть утиліту запитів. Особливо ефективне використання React Server Components — вони дозволяють виконувати запити на сервері та передавати готовий JSON клієнту без додаткових запитів:
// lib/kirby.ts
const KQL_ENDPOINT = `${process.env.KIRBY_URL}/api/query`;
const AUTH = Buffer.from(`${process.env.KIRBY_API_USER}:${process.env.KIRBY_API_PASSWORD}`).toString('base64');
export async function kqlQuery(query: object) {
const res = await fetch(KQL_ENDPOINT, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Basic ${AUTH}`,
},
body: JSON.stringify({ query }),
next: { revalidate: 3600 },
});
return res.json();
}
Тепер ви можете викликати kqlQuery у серверних компонентах Next.js. Кешування з revalidate гарантує свіжі дані без втрати продуктивності.
Що входить у налаштування headless Kirby?
- Розгортання Kirby та налаштування config.php під headless-режим
- Вибір та налаштування API (KQL або REST) з аутентифікацією та CORS
- Створення read-only користувача для API
- Документація по API (ендпоінти, приклади запитів)
- Інтеграція з вашим фронтендом (React, Next.js, Vue)
- Тестування продуктивності та безпеки
- Навчання вашої команди роботі з API (1 година онлайн)
Терміни та досвід
Базове налаштування headless Kirby під ключ займає від 2 до 4 днів, залежно від складності проєкту. Вартість розраховується індивідуально. Наша команда має понад 8 років досвіду роботи з Kirby та більше 15 реалізованих headless-проєктів. Гарантуємо стабільну роботу API та повну документацію. Економія бюджету порівняно з альтернативами сягає 30% завдяки легкій архітектурі Kirby. Зв'яжіться з нами, щоб обговорити ваш проєкт. Отримайте консультацію з налаштування Kirby API. Звертайтесь, і ми перетворимо ваш Kirby на потужний headless-бекенд.







