Всё началось по приколу... Потратил на это 24 часа. На основе той болванки, которую показывал ранее.
Перенос данных из WordPress
Старый сайт жил на WordPress. Статьи, комментарии, теги, авторы, картинки — всё это нужно было перетащить в новую базу на Laravel. Готовых инструментов для этого нет, так что написали пачку artisan-команд, каждая отвечает за свой кусок: авторы, статьи, комментарии, теги, картинки.
Самое интересное — конвертация контента. WordPress хранит статьи в формате Gutenberg (HTML с кучей служебных комментариев типа <!-- wp:paragraph -->). Всё это нужно было превратить в чистый Markdown. Отдельный сервис разбирает Gutenberg-блоки — код, эмбеды YouTube, таблицы, цитаты, спойлеры, галереи — и выдаёт нормальный Markdown. Статьи хранятся сразу в двух видах: исходник в Markdown и готовый HTML для отдачи на фронт.
С комментариями похожая история. В WordPress они лежали в HTML, а нам нужен Markdown. Отдельная команда прогоняет их чанками по 500 штук и конвертирует теги в Markdown-разметку.
SQL-дамп парсится потоково, без загрузки всего файла в память — иначе на больших базах можно упереться в лимиты. Древовидная структура комментариев (кто кому ответил) пересобирается через Nested Set после импорта.
Стек технологий
Бэкенд
| Компонент | Версия | Назначение |
|---|---|---|
| PHP | ^8.2 | Язык |
| Laravel | 12 | Фреймворк |
| Filament | 3 | Админ-панель (Livewire + Alpine.js) |
| Inertia.js | 2 | Мост Laravel ↔ Vue (серверный роутинг, SPA-навигация) |
| Laravel Sanctum | 4 | Аутентификация через cookies |
| Laravel Breeze | 2.3 | Скелет аутентификации (только для админки) |
| spatie/laravel-permission | 6 | Роли и права доступа |
| kalnoy/nestedset | 6 | Иерархические комментарии (Nested Set) |
| spatie/laravel-sitemap | 8 | Генерация sitemap.xml |
| Ziggy | 2 | Именованные Laravel-маршруты в JavaScript |
| League\CommonMark | — | Рендеринг Markdown → HTML (с расширениями Strikethrough, Table) |
Фронтенд
| Компонент | Версия | Назначение |
|---|---|---|
| Vue.js | 3.4+ | UI-фреймворк |
| Inertia.js Vue 3 adapter | 2 | Интеграция Vue с Inertia |
| Tailwind CSS | 3 | Утилитарный CSS-фреймворк |
| @tailwindcss/forms | 0.5 | Стилизация форм |
| @tailwindcss/typography | 0.5 | Типографика для пользовательского контента |
| Vite | 7 | Сборщик (клиентский бандл + SSR) |
| @vitejs/plugin-vue | 6 | Vue-плагин для Vite |
| Axios | 1.11 | HTTP-клиент (AJAX-загрузка ответов) |
| @vue/server-renderer | 3.5 | Server-Side Rendering |
| ziggy-js | 2.6 | Клиентская часть Ziggy (хелпер route()) |
Инфраструктура (Docker)
| Сервис | Образ | Назначение |
|---|---|---|
| php | custom (PHP-FPM) | Приложение |
| nginx | nginx:alpine | Веб-сервер |
| mysql | mysql:8 | База данных |
| redis | redis:alpine | Кэш, сессии |
| scheduler | custom (PHP) | php artisan schedule:work |
| ssr | custom (PHP+Node) | node bootstrap/ssr/ssr.js |
| node | custom (Node) | Vite dev-сервер (только dev-профиль) |
Инструменты разработки
| Инструмент | Назначение |
|---|---|
| Claude Code v2.1.73 (Opus 4.6, high effort, тариф Max) | Написание кода |
| Laravel Pint | Линтинг/форматирование PHP |
| PHPUnit 11 | Тестирование (Unit + Feature, SQLite in-memory) |
| Laravel Pail | Просмотр логов в реальном времени |
| barryvdh/laravel-ide-helper | PHPDoc-аннотации для IDE |
| Faker (ru_RU) | Генерация тестовых данных |
| Mockery | Мок-объекты для тестов |
| Concurrently | Параллельный запуск dev-серверов |


Первый!