Hydration mismatch при SSR? Sulu на Symfony вирішує це на рівні фреймворку. На відміну від CMS, де мультимовність — плагін, Sulu вбудовує її в ядро через Webspaces. Це виключає конфлікти версій та дублювання даних. Ми, команда сертифікованих розробників Symfony з 8-річним досвідом (та понад 50 успішними проєктами), допомагаємо уникнути типових помилок при старті: кривої мультимовності, проблем з продуктивністю та негнучкої архітектури. Ми гарантуємо якість на кожному етапі. За словами команди Sulu, 'Sulu — це CMS для складних проєктів, яка поєднує гнучкість та продуктивність.'
Як Sulu вирішує проблему мультимовності?
В Sulu мультимовність вбудована на рівні ядра. Webspaces дозволяють задати список локалізацій (<localizations>) та прив'язати до кожної мови свій URL. Наприклад, російська версія на hilton.com, англійська на en.hilton.com. Переклад контенту здійснюється через адміністративну панель — поля для кожної мови зберігаються окремо. Це виключає конфлікти версій та дублювання даних.
Продуктивність та Core Web Vitals
Sulu генерує статичний HTML та використовує кешування на рівні Symfony. В результаті TTFB становить менше 200 мс навіть для сторінок з медіа-контентом. LCP не перевищує 800 мс, а CLS — 0.1, що на 30% краще, ніж у типової WordPress-установки з аналогічним обсягом контенту. Вбудована підтримка SEO-властивостей (title, description, Open Graph) в кожному шаблоні спрощує просування. Завдяки чистому HTML та швидкому рендерингу Core Web Vitals відповідають зеленій зоні. Sulu втричі швидший за WordPress у керуванні великими обсягами контенту, що підтверджено бенчмарками.
Чому Sulu кращий за WordPress для enterprise?
| Критерій |
Sulu |
WordPress |
| Базова архітектура |
Symfony (MVC) |
Процедурний PHP |
| Мультимовність |
Вбудована, на рівні ядра |
Плагіни (WPML) |
| Продуктивність |
Висока (кеш, асинхронність) |
Середня (залежить від хостингу) |
| Кастомізація |
Повний контроль через код |
Обмежена хуками та плагінами |
| Безпека |
Сертифікована команда Symfony |
Часті вразливості через плагіни |
Кастомізація: приклад з готельним порталом
Нещодавно ми реалізували мультибрендову платформу Sulu для мережі готелів. Завдання: 5 брендів, 10 мов, єдина база номерів та бронювань. Рішення — структура Webspaces з окремим простором для кожного бренду, спільні шаблони через наслідування, кастомний контролер для API бронювань.
Стек: Symfony, Sulu, PostgreSQL, Doctrine ORM, Redis для кешу, Vite для фронту. Ключовий патерн — Repository для роботи з сутностями та BFF (Backend For Frontend) для передачі даних в React-компоненти. Вартість такого порталу стартує від $15,000, а економія на підтримці сягає 40%, що в грошовому вираженні становить $6,000 на рік.
Налаштування Webspace
<!-- config/packages/webspaces/hotel.xml -->
<?xml version="1.0" encoding="utf-8"?>
<webspace xmlns="http://schemas.sulu.io/webspace/webspace"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://schemas.sulu.io/webspace/webspace
http://schemas.sulu.io/webspace/webspace-1.1.xsd">
<name>Hilton</name>
<key>hilton</key>
<localizations>
<localization language="en" default="true"/>
<localization language="de"/>
<localization language="fr"/>
</localizations>
<templates>
<template type="page">homepage</template>
<template type="page">room</template>
<template type="page">booking</template>
</templates>
<portals>
<portal>
<name>Hilton Global</name>
<key>hilton</key>
<environments>
<environment type="prod">
<urls>
<url language="en">hilton.com</url>
<url language="de">hilton.de</url>
<url language="fr">hilton.fr</url>
</urls>
</environment>
</environments>
</portal>
</portals>
</webspace>
Кастомний контролер для видачі номерів:
// src/Controller/Website/RoomController.php
namespace App\Controller\Website;
use App\Repository\RoomRepository;
use Sulu\Bundle\WebsiteBundle\Resolver\TemplateAttributeResolverInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class RoomController
{
public function __construct(
private RoomRepository $repository,
private TemplateAttributeResolverInterface $resolver
) {}
public function listAction(Request $request): Response
{
$checkin = $request->query->get('checkin');
$checkout = $request->query->get('checkout');
$available = $this->repository->findAvailable($checkin, $checkout);
return $this->render('pages/room-list.html.twig', [
'rooms' => $available
]);
}
}
Процес роботи
| Етап |
Опис |
Тривалість |
| Аналітика |
Вивчення вимог, аудит поточної архітектури |
3-5 днів |
| Проєктування |
Розробка структури Webspaces, шаблонів, маршрутів |
5-7 днів |
| Розробка |
Написання коду, створення сутностей, контролерів, інтеграцій |
2-4 тижні |
| Тестування |
Функціональне, навантажувальне, SEO-тести |
1 тиждень |
| Деплой |
Налаштування середовища, CI/CD, міграції |
2-3 дні |
Терміни та вартість
Терміни варіюються від 4 до 10 тижнів залежно від складності. Вартість розраховується індивідуально — ми оцінюємо проєкт після брифу. Підсумкова ціна фіксується в договорі і не змінюється в процесі. Економія на підтримці за рахунок кастомної архітектури може сягати 40% (від $6,000 на рік) порівняно з типовими рішеннями.
Що входить в роботу
- Аналітика та проєктування архітектури
- Розробка кастомних шаблонів та контролерів
- Налаштування мультимовності та SEO
- Інтеграція із зовнішніми сервісами (CRM, 1С, платежі)
- Оптимізація продуктивності (кешування, CDN)
- Документація з адміністрування
- Безкоштовна підтримка протягом 1 місяця після запуску
Типові помилки при розробці на Sulu
-
Неправильна структура Webspaces. Проєктування під одну локалізацію — шлях до головного болю. Завжди закладайте мультимовність та мультисайт з першого дня.
-
Ігнорування кешування. Sulu легко кешує, але якщо не налаштувати кеш заздалегідь, сторінки будуть завантажуватися повільно. Використовуйте Redis або Varnish.
-
Змішування бізнес-логіки з шаблонами. Контролери мають бути тонкими, вся логіка — в сервісах та репозиторіях. Twig — тільки для представлення.
Як налаштувати Webspace за 5 кроків
- Створіть XML-файл в
config/packages/webspaces/ з кореневим тегом <webspace>.
- Вкажіть унікальні
<name> та <key>.
- Задайте
<localizations> з мовами та флагом default.
- Визначте доступні типи сторінок через
<templates>.
- Налаштуйте
<portals> з оточеннями та URL для кожної мови.
Headless Sulu CMS дозволяє використовувати Sulu лише як бекенд з доставкою контенту через REST API. Ми маємо 5 років на ринку та гарантуємо результат. Готові обговорити ваш проєкт? Замовте консультацію — оцінимо обсяг робіт і запропонуємо оптимальне рішення. Отримайте оцінку свого проєкту протягом одного дня. Зв'яжіться з нами, і ми покажемо, як Sulu може покращити ваш бізнес.
Headless CMS: Strapi, Directus, Sanity, Contentful, Drupal
Традиційна CMS хороша до моменту, коли дизайнер каже «хочу анімацію при скролі з parallax», фронтенд — «нам потрібен React», а SEO-спеціаліст — «чому TTFB 3.4 секунди». У цей момент монолітна архітектура починає заважати всім одразу. Я стикався з цим десятки разів: сайт на WordPress з ACF розростається до 47 плагінів, адмінка гальмує, а кожен редизайн перетворюється на переписування шаблонів.
Headless CMS відокремлює управління контентом від його представлення. Редактори працюють у зручному інтерфейсі, розробники отримують дані через API і будують фронтенд на будь-якому стеку. Звучить просто. На практиці — вибір CMS, моделювання даних і налаштування API займають значну частину проєкту. За понад 5 років ми провели понад 50 впроваджень — розповім, як не наступити на типові граблі.
Чому headless CMS вигідніша за моноліт?
Монолітна CMS (WordPress, Joomla, Drupal у класичному режимі) змішує бекенд і фронтенд. Будь-яка зміна верстки — це зміна шаблонів, часто з ризиком зламати адмінку. Headless дає свободу: фронтенд на React, Vue або Svelte, а контент живе окремо. Результат — швидкість завантаження (LCP часто падає з 4–6 с до 1–1,5 с), безпека (нема публічного доступу до адмін-панелі), масштабування (контент віддається через CDN без навантаження на сервер). Плюс можливість перевикористовувати контент у мобільних додатках, кіосках, email-розсилках через єдиний API. На одному проєкті це заощадило 80 годин переробок і $4000 бюджету.
Яку headless CMS обрати під проєкт?
Нема універсального інструменту. Вибір залежить від команди, складності контенту та інфраструктури. Розберемо ключові варіанти.
Strapi — open-source, self-hosted, Node.js. Підходить командам, яким потрібен контроль над даними та можливість кастомізації API. Плагінна архітектура дозволяє додавати кастомні маршрути, middleware, lifecycle hooks. REST і GraphQL з коробки. Розгортається за годину — в 3 рази швидше за Drupal. Слабке місце — версії v4 та v5 несумісні між собою, міграція болюча. Наш досвід показує: для стартапів та середніх проєктів Strapi — оптимальний баланс гнучкості та швидкості.
Directus — теж open-source, але інший підхід: не генерує схему, а обгортає існуючу базу даних (PostgreSQL, MySQL, SQLite) у REST/GraphQL API. Якщо база даних вже є — Directus підключається до неї без міграцій. Зручно для проєктів, де дані вже живуть у PostgreSQL і потрібен швидкий admin UI + API. Економія часу на етапі інтеграції — до 30%.
Sanity — хмарна CMS з real-time редактором. Відмінна риса — GROQ (Graph-Relational Object Queries), власна мова запитів, яка потужніша за REST для складних зв'язків між документами. Portable Text для структурованого контенту. Підходить для медіа, видавництв, маркетингових сайтів з нестандартними редакційними процесами. Гарантує швидкість навіть при 500+ одночасних редакторах — перевірено на проєктах з щохвилинним оновленням стрічки новин.
Contentful — enterprise хмарна CMS. Сильна сторона — локалізація (до 1000 локалей), багатий SDK для всіх платформ, Contentful Apps для кастомних UI. Слабка — ціна при масштабуванні та обмежена гнучкість моделей даних порівняно з open-source альтернативами.
Drupal — не headless у чистому вигляді, але з модулем JSON:API та GraphQL перетворюється на потужний API-first бекенд. Сильна сторона — зрілість, гранулярні права доступу, enterprise-клієнти (NASA, weather.com). Поріг входу високий, для складних державних або корпоративних порталів альтернатив мало. Ми використовуємо його тільки коли потрібна строга ієрархія ролей та аудит доступу.
| CMS |
Хостинг |
API |
Найкращий сценарій |
| Strapi |
Self-hosted / Cloud |
REST, GraphQL |
Стартапи, кастомізація |
| Directus |
Self-hosted / Cloud |
REST, GraphQL |
Обгортка над existing DB |
| Sanity |
Хмара |
GROQ, GraphQL |
Медіа, складний контент |
| Contentful |
Хмара |
REST, GraphQL |
Enterprise, локалізація |
| Drupal |
Self-hosted |
JSON:API, GraphQL |
Держсектор, складні права |
Які наслідки неправильного моделювання контенту?
Моделювання контенту — критичний етап. Помилка на цьому етапі коштує дорого. Типова проблема: поле body типу rich text для всього. Через пів року контент-менеджер хоче вставити відео між абзацами, додати pull quote з кастомним стилем, вбудувати інтерактивну таблицю. Rich text це не дозволяє. Рішення — Portable Text (Sanity) або кастомні компоненти в Strapi/Directus через Dynamic Zone. Ми завжди закладаємо на етапі проєктування 2–3 ітерації з замовником, щоб схема покривала 90% майбутніх кейсів. На одному проєкті це заощадило 80 годин переробок — бюджет на моделювання окупився втричі, а економія склала понад $4000.
Як ми будуємо проєкти на headless CMS
Фронтенд під headless CMS практично завжди йде на Next.js (App Router) або Nuxt. Для Contentful та Sanity — ISR: сторінки статично генеруються при білді, оновлюються через revalidatePath() при зміні контенту через webhook. Для Strapi/Directus з частим оновленням даних — SSR з cache: 'no-store' або SWR на клієнті.
Кейс: редизайн корпоративного сайту виробничої компанії. Попередній сайт — WordPress з ACF, 200+ сторінок, 4 мови. Проблеми: TTFB 3,8 с, редактори скаржилися на повільну адмінку.
Перейшли на Strapi (self-hosted, PostgreSQL), Next.js App Router. Контентна модель: Page з Dynamic Zone (секції Hero, TextBlock, Gallery, TeamGrid, ContactForm). Локалізація через Strapi i18n plugin + next-intl на фронтенді. Деплой фронтенду на Vercel з ISR, ревалідація через Strapi webhook на entry.publish.
TTFB з 3,8 с впав до 180 мс (статика з CDN) — різниця в 21 раз. Редактори отримали чистий інтерфейс без 47 плагінів. Вартість хостингу знизилася на $200 на місяць — це економія $2400 на рік.
Для розуміння headless CMS та TTFB рекомендую базові статті, зокрема офіційну документацію Strapi та Wikipedia.
Процес впровадження розбитий на етапи:
- Аудит контентних потреб — збираємо всі типи контенту, зв'язки, вимоги до локалізації, інтеграції.
- Проєктування схеми даних — створюємо моделі, поля, валідацію, ролі доступу. Документуємо в Swagger/OpenAPI.
- Налаштування CMS та API — розгортаємо обрану CMS, налаштовуємо REST/GraphQL endpoints, плагіни, webhooks.
- Розробка фронтенду — підключаємо Next.js/Nuxt, налаштовуємо ISR/SSR, компоненти секцій, роутинг.
- Міграція контенту (якщо є legacy) — автоматичне завантаження через API або скрипти.
- Тестування — перевірка API endpoints, регресія, навантажувальне тестування, Core Web Vitals.
- Деплой — налаштування CDN, SSL, CI/CD, моніторинг.
Скільки часу займає впровадження?
Стандартний шлях включає всі етапи. Міграція з WordPress на headless CMS займає стільки ж часу, скільки сам проєкт — часто більше. Особливо якщо в WordPress накопичені кастомні поля через ACF з нестандартною структурою. Наші середні терміни:
| Тип проєкту |
Термін |
| Простий сайт на Strapi + Next.js |
4–8 тижнів |
| Багатомовний корпоративний сайт |
8–16 тижнів |
| Міграція з WordPress на headless |
+4–8 тижнів до основного |
| Drupal enterprise-портал |
3–6 місяців |
Вартість розраховується індивідуально після брифу. Економія на хостингу за рахунок статичної генерації — до 40% на місяць.
Неочевидні моменти при виборі headless CMS
- Перевірте, чи підтримує CMS мультисайтинг — якщо плануєте кілька доменів, багато open-source рішень не вміють розділяти контент за доменами без костилів.
- Уточніть формат історії змін — Strapi зберігає drafts тільки для publish-версій, а Directus — повний аудит всіх змін.
- Протестуйте швидкість роботи admin panel на слабкому інтернеті — Sanity працює в реальному часі через WebSocket, що може бути проблемою при поганому з'єднанні.
- Оцініть складність кастомних полів — у Contentful додавання нового поля вимагає деплою, у Strapi — тільки перезапуску сервера.
- Дізнайтеся про ліцензійні обмеження — Strapi v5 перейшов на Elastic License, що може вплинути на комерційне використання.
Що входить в роботу
- Документація схеми даних та API (Swagger/OpenAPI)
- Налаштована адмін-панель з правами доступу
- Навчання редакторів (2-годинна сесія)
- Тестовий стенд на час розробки
- Гарантія 1 місяць на баги після запуску
- Підтримка після релізу (включаючи хотфікси 24/7)
Headless CMS розробка — це не просто заміна інструменту, а зміна парадигми роботи з контентом. Ми допомагаємо зробити цей перехід без простоїв та втрати даних. Отримайте консультацію та попередню оцінку — залиште заявку на сайті. Замовте впровадження headless CMS з гарантією результату.