Тема
Выбор пути: build vs adopt
Статус: рекомендация сформирована. Как строить ядро — с нуля, на готовой Laravel-CMS, гибрид или headless. Вывод: Путь C — своё ядро на Laravel+Filament + агрессивное заимствование готовых пакетов. Дополняет исследование ядер (там — механизмы расширяемости; здесь — стратегия построения).
Актуальный контекст (июль 2026)
Факты, влияющие на выбор:
- Filament v4 (сер. 2025, schema-система, таблицы в 2–3× быстрее), v5 (янв. 2026, Livewire 4) — штатный стек студии, экосистема зрелая и активная. Целевая версия ядра —
^5.6.6(нижняя граница совместимости с Laravel 13; ранние 5.x — нет). Стек в целом: Laravel 13 · PHP 8.4 · PostgreSQL 16 — см. канонический стек и целевую платформу. - Statamic: Solo бесплатна навсегда (single-user), Pro ~$349/сайт one-time (мультиюзер, роли, ревизии). Модель one-time, но per-site.
- Twill 3.5 (Laravel 12) — активен, но это CRUD-тулкит, не готовая CMS: нет страниц/меню/SEO как продукта.
- Lunar 1.x уже на Filament; v2 (alpha, лето 2026) — выделенный Filament-bridge. Ложится на стек студии для e-commerce-модуля.
- October v4.3 / Winter — активны, но Twig + своя plugin-экосистема, чужеродны Blade+Filament.
Сравнение путей
Оценки ★ (плохо) … ★★★★★ (отлично) под профиль студии: один разработчик, парк managed-сайтов, ориентир Битрикс, штатный Filament+Blade, дистрибуция composer+Satis, центр обновлений с откатом.
| Критерий | A. Своё с нуля | B. Готовая CMS как база | C. Гибрид | D. Headless |
|---|---|---|---|---|
| Скорость старта | ★★ | ★★★★★ | ★★★★ | ★★★ |
| Контроль над ядром | ★★★★★ | ★★ | ★★★★★ | ★★★★ |
| Парк + центр обновлений | ★★★★★ | ★★ | ★★★★★ | ★★★ |
| Совместимость с Filament | ★★★★★ | ★–★★ | ★★★★★ | ★ |
| Совместимость с Blade+острова | ★★★★★ | ★★★–★★★★ | ★★★★★ | ★★ |
| Риск lock-in / лицензии | ★★★★★ | ★★ | ★★★★★ | ★★ |
| Поддержка одним разработчиком | ★★ | ★★★ | ★★★★ | ★★ |
| Под drag&drop блоки | ★★★★ | ★★★★ | ★★★★★ | ★★★★ |
| Обновление парка (composer) | ★★★★★ | ★★★ | ★★★★★ | ★★★ |
| РФ-специфика (платежи/1С/гео) | ★★★★★ | ★★ | ★★★★★ | ★★★ |
Рекомендация: Путь C (гибрид)
Своё ядро на Laravel + Filament + агрессивное заимствование готовых пакетов. Почему остальные проигрывают именно в контексте студии:
Почему не B (готовая CMS как база). Единственный кандидат, экономящий старт — Statamic, но он тянет свой Control Panel вместо Filament (обнуляет главный актив студии) и Pro-лицензию per-site (~$349 × N сайтов — конфликт с масштабированием парка). Botble — CodeCanyon-лицензия и не-composer-native обновления (убивает модель Satis+откат). Winter/October — Twig, ортогональны стеку. Twill — не CMS, а CRUD-тулкит. Взять чужую CMS = отдать контроль над центром обновлений вендору.
Почему не A (чистый велосипед). Писать медиатеку, права, переводы, поиск, бэкапы с нуля силами одного разработчика — годы и вечное сопровождение. Под каждую подсистему в Laravel есть зрелый MIT-пакет от spatie. Переизобретать бессмысленно.
Почему не D (headless). SEO-критичность + Blade+острова прямо противоречат headless: два стека и два артефакта деплоя (PHP-бэк + JS-фронт), удвоение нагрузки на одного разработчика, SSR-возня ради SEO. Для корпоративно-каталожных сайтов server-rendered Blade выигрывает и по SEO, и по стоимости владения.
«Тонкое ядро» ≠ «бедное ядро»
Важное уточнение к нашему принципу «универсальное ядро»: «тонкое» здесь значит не переписывать инфраструктуру, а собирать ядро из готовых пакетов. Ядро остаётся богатым по возможностям (движок полей, события, API, редакторы), но его инфраструктурные части (медиа, права, переводы, поиск, бэкапы) — это зрелые spatie-пакеты, а не свой код. Своим кодом пишем только то, чего нет готового: доменную модель (страницы, блоки, типы контента, мультигород, SEO-слой), контракты расширяемости и центр обновлений.
Что заимствовать из готовых CMS (паттерны, не код)
| Источник | Что берём |
|---|---|
| Statamic | Модель Bard/Replicator (структурированные повторяемые блоки) как эталон drag&drop-редактора; flat-file для конфигов/шаблонов отдельно от контента; чистая модель ревизий |
| Twill | Блочный редактор (nestable blocks); паттерн «CRUD-триада» (Module = Controller+Request+Repository) для быстрой штамповки сущностей; медиа-slots |
| October/Winter | Лестница расширяемости (тема → компонент → плагин); партиалы/компоненты страницы; версионирование плагинов |
| Botble | Готовая карта модулей типового корпоративного сайта — как чек-лист скоупа (не код) |
| Filament v4/v5 | Schema-driven страницы для конструктора админ-форм блоков — это фундамент, не заимствование |
| TomatoPHP Filament CMS | Референс «постов/страниц/категорий поверх Filament» — подсмотреть паттерны Resource'ов |
| Filament Fabricator / Curator | Референсы page-builder'а на блоках и медиа-менеджера поверх Filament — паттерны для drag&drop-редактора и файлового менеджера ядра |
Готовые пакеты — взять, а не писать
Каждый зрелый, преимущественно MIT, composer-native (совместим с Satis и центром обновлений):
| Подсистема | Пакет | Что закрывает |
|---|---|---|
| Медиатека | spatie/laravel-medialibrary | Загрузка, conversions, responsive; интеграция с Filament |
| Права/роли | spatie/laravel-permission | RBAC — основа мультиюзерной админки парка |
| Переводы контента | spatie/laravel-translatable | Переводимые атрибуты моделей (мультиязычность per-record) |
| UI-переводы | штатный lang/ + __() | Строки интерфейса |
| Админ-панель | filament/filament (v4/v5) | Ресурсы, формы, таблицы, виджеты, tenancy — ядро админки |
| Теги/категории | spatie/laravel-tags | Полиморфные теги |
| SEO/sitemap | spatie/laravel-sitemap | Генерация sitemap; SeoService сверху |
| Slug | spatie/laravel-sluggable | Авто-slug из title, unique-логика |
| Аудит | spatie/laravel-activitylog | Журнал изменений — нужен для парка и отката |
| Бэкапы | spatie/laravel-backup | Бэкап БД+файлов перед обновлением — фундамент отката |
| Настройки | свой settings-store (донор universal) | Каскад БД→config, city/locale-измерение, теговый кеш (три оси); spatie/laravel-settings отклонён — нет city/locale-измерения |
| Фильтры каталога | spatie/laravel-query-builder | Фильтрация/сортировка в API островов |
| Поиск | laravel/scout (+ Meilisearch/Typesense) | Полнотекст; для PG-only — GIN/tsvector |
| Модульность (dev) | nwidart/laravel-modules | Разработка модулей в монолите; дистрибуция — отдельными пакетами |
| E-commerce | lunarphp/lunar (1.x, v2-bridge) | Каталог/корзина/заказы/цены — Filament-native, как модуль |
| Дистрибуция | composer/satis (или Private Packagist) | Приватный composer-репозиторий — ядро центра обновлений |
| Обработка изображений | intervention/image | Под medialibrary conversions |
| Фиче-флаги | laravel/pennant | Включение модулей/фич per-site без форков |
| Health-мониторинг | spatie/laravel-health | Состояние managed-сайтов (БД, кеш, очереди, диск) |
| Шина интеграций | saloonphp/saloon | Коннекторы к внешним API: аутентификация, ретраи, моки в тестах — фундамент integration-core |
| Вебхуки (исх./вх.) | spatie/laravel-webhook-server + webhook-client | HMAC-подпись, ретраи с backoff, верификация — закрывают оба вебхук-модуля |
| Статанализ контрактов | larastan/larastan + Pest arch-тесты | Запреты контракта модуля (env(), Route::, запись в cms_*) — кастомные правила вместо своего анализатора |
| Скриншот-сверка блоков | spatie/browsershot | Галерея /_gallery ↔ макет (контракт темы) |
| Деплой релизов | deployer/deployer | Модель releases/+симлинк и dep rollback из центра обновлений |
| Realtime | laravel/reverb | WebSocket для админки/чата (Broadcasting-модуль) |
| Мониторинг производительности | laravel/pulse | Дешёвые метрики сайтов парка → телеметрия флит-дашборда |
| Контроль cron | spatie/laravel-schedule-monitor | Провал регулярной задачи виден, а не тих |
| Деревья (меню/категории/локации) | staudenmeir/laravel-adjacency-list | Рекурсивные CTE вместо самописных parent_id-обходов |
| XLSX-экспорт | openspout/openspout | Потоковые прайс-выгрузки без OOM |
| История входов | rappasoft/laravel-authentication-log | Требование кабинетов: сессии, уведомления о новом входе |
| Мультитенант (под заказ) | stancl/tenancy | Инфра-модуль мультитенантности — не ядро (anti-goal) |
| DTO событий | spatie/laravel-data | Типизированные semver-стабильные payload событий ядра |
| JSON-LD | spatie/schema-org | Типизированная генерация Schema.org в SEO-ядре |
| Honeypot | spatie/laravel-honeypot | Защита форм ядра (Q8) |
РФ-специфика — только своими модулями (готовых нет):
- Платежи (ЮKassa/Тинькофф/Робокасса) — свой
payment-ru; для Lunar — драйвер под его payment-контракт; - 1С-обмен — свой
integration-1c(CommerceML); - Мультигород — своя доменная логика ядра (
BelongsToCity+ city-scoped роутинг), не пакет.
Итог одной фразой
Стройте богатое собственное ядро на Laravel + Filament, разложенное на composer-пакеты в Satis с семвер-обновлением и откатом (spatie/laravel-backup + laravel/pennant); всю инфраструктуру берите готовыми spatie-пакетами, e-commerce — на Lunar, а у Statamic/Twill/October заимствуйте паттерны блочного редактора и лестницы расширяемости, но не код и не лицензию. Это единственный путь, сохраняющий Filament+Blade-актив, не отдающий центр обновлений вендору и сопровождаемый одним разработчиком.