Задача на входе
«Кубок развития» — международный юношеский турнир в Минске с длинной историей и устоявшимся контуром: сезоны, команды, матчи, протоколы, новости, мультимедиа, трёхязычность (RU / BY / EN).
На проде уже работала CMS-платформа на старом стеке. Для зрителя сайт существовал. Для бренда, UX и эксплуатации картина была типичной для зрелого спортивного продукта:
- логотип и визуальный язык отставали от современной спортивной культуры и ожиданий юной аудитории;
- runtime и фреймворк вышли из зоны комфортной поддержки;
- админка и пакеты вокруг неё жили на версиях mid-2010s;
- публичная витрина нуждалась в современном editorial UX без ломки маршрутов и редакционных процессов;
- данные (команды, сезоны, медиа) нельзя было «обнулить ради красоты».
Нужно было не витрину ради витрины, а связку:
- обновить логотип и визуальную идентичность, сохранив узнаваемость турнира;
- собрать публичный слой как турнирный медиапродукт под новую айдентику;
- провести крупный апгрейд backend / инфраструктуры с переносом данных;
- сохранить рабочие сущности турнира и привычные URL там, где это важно для SEO и привычек аудитории.
Работы шли параллельными контурами: бренд, публичный фронт и платформенный апгрейд (PHP, Symfony, EasyAdmin, Doctrine, MySQL, Nginx и экосистема бандлов). Это важно честно фиксировать: один человек / один чат не закрывает весь объём такого проекта.
Почему не «с нуля любой ценой»
Переписать всё на новом стеке с чистого листа для сезонного турнира — риск по сроку, бюджету и редакционным данным.
Ограничения, которые задали рамку:
| Ограничение |
Что из этого следует |
| Живые сезоны и архив |
Миграция данных, не «новый пустой CMS» |
| Маршруты вроде таблиц и матчей |
Фронт проектируется под существующую карту URL / слотов |
| Редакция уже умеет EasyAdmin-контур |
Апгрейд админки, а не смена парадигмы «ради моды» |
| Публичный UX отставал от бренда турнира |
Отдельный фронтовый проход без ожидания полного rewrite backend |
| Логотип «узнаваем, но устал» |
Редизайн персонажа и типографики без смены имени турнира |
Решение: новая айдентика + новый публичный слой + модернизация платформы. Фронт стыкуется к CMS через шаблонные слоты (TEMPLATE / slot:).
Что сделали
1. Редизайн логотипа и визуальной идентичности
Отдельный креативный контур — Development Football Cup: обновить знак детского / юношеского турнира так, чтобы он стал современнее и эмоциональнее, но остался узнаваемым.
Задача бренда. Существующий логотип нуждался не в косметическом «подтянуть цвет», а в новом образе: динамика, спортивный азарт, развитие — без потери связи с «Кубком развития».
Концепция. В основу легли три опоры: футбол, развитие и энергия молодого поколения. Вместо абстрактного символа центром стал динамичный юный футболист — персонаж, который читается и детьми, и подростками: движение вперёд, игра, стремление к победе.
Что изменилось на практике:
| Было по смыслу |
Стало |
| Традиционный графический знак |
Стилизованный персонаж-футболист как главный якорь |
| Спокойная / устаревшая подача |
Траектории, скоростные линии, энергетика мяча и движения |
| Типографика «как было» |
Массивные спортивные буквы с объёмом и жёсткой геометрией |
| Сдержанная палитра |
Насыщенный зелёный, неоновый лайм, серебристо-белый |
| Одна языковая сборка |
Версии RU / BY / EN под сайт, соцсети и носители |
Результат для бренда: турнир получил более яркое визуальное лицо под молодую аудиторию. Та же айдентика рассчитана на сайт, соцсети, рекламу, форму, дипломы и прочие носители — не только на favicon в шапке.

2. Публичный сайт турнира
Собран новый фронт публичной части под реальные разделы продукта и под обновлённый бренд:
- главная: hero-карусель новостей, результаты, лента;
- о турнире;
- турнирная таблица (сезоны, группы, вкладки таблица / матчи / бомбардиры, финальная стадия);
- команды и карточка команды (состав, медиа, тренер);
- матч: табло, составы, схема поля, протокол;
- новости и статья;
- мультимедиа (альбомы, lightbox, опциональный YouTube);
- профили игрока и тренера;
- тематический 404;
- переключатель Ru / Blr / En (в шапке — соответствующие версии логотипа).
Стек фронта намеренно лёгкий: HTML5, единый CSS, JS + i18n без тяжёлого SPA-бандла. Для спортивной витрины с CMS-данными это осознанный trade-off: скорость вёрстки, предсказуемая стыковка со слотами и контроль над motion/a11y (prefers-reduced-motion, skip-link, ARIA).
Визуально — тёмный editorial sports-look в палитре обновлённой айдентики, шрифты Manrope + Unbounded, акцент на гербы команд, лого и фото матчей, а не на «карточки ради карточек».

3. Апгрейд платформы (backend + инфраструктура)
Параллельный и более тяжёлый контур — поднять весь серверный стек на актуальные LTS/поддерживаемые ветки без потери данных.
Runtime и фреймворк
| Компонент |
Было |
Стало |
| PHP |
7.0 |
8.5 |
| Symfony (+ Form, Security, Serializer, Validator, HttpClient, Twig, Mailer и др.) |
3.3 |
7.4.x |
| EasyAdmin |
1.17 |
5.8 |
| Doctrine ORM |
2.5 |
3.7 |
| Doctrine DBAL |
— |
4.5 |
| Doctrine Bundle |
— |
3.3 |
Это не «minor bump»: между Symfony 3 и 7 — смена контрактов безопасности, DI, форм, сериализации и экосистемы бандлов. EasyAdmin 1 → 5 — фактически другая админ-модель. Doctrine 2 → 3 / DBAL 4 — отдельный слой миграции сущностей и запросов.
Сопутствующие пакеты
| Пакет |
Было |
Стало |
| VichUploader |
1.4 |
3.0 |
| LiipImagine |
1.9 |
2.18 |
| FOSUserBundle |
2.0 |
4.1 |
| CKEditor |
Ivory/egeloen 4.x |
friendsofsymfony/ckeditor-bundle 2.8 |
| FMElfinder |
6.2 |
14.0 |
| a2lix/translation-form-bundle |
2.1 |
4.0 |
| knplabs/doctrine-behaviors |
1.4 |
3.1 |
| beelab/recaptcha2-bundle |
1.2 |
2.14 |
Набор показателен: загрузки и превью изображений, пользователи, WYSIWYG, файловый менеджер, переводы форм, soft-behaviors Doctrine, reCAPTCHA — всё, чем живёт редакционный спортивный CMS.
База и веб-сервер
| Компонент |
Было |
Стало |
Как переносили |
| MySQL |
5.7 |
8.0 |
миграция данных через дамп |
| Nginx |
(старая ветка) |
1.30.6 |
обновление на целевом контуре |
Окно поддержки безопасности (на момент сдачи контура)
- Symfony 7.4 (LTS) — исправления безопасности до ноября 2029;
- PHP 8.5 — до декабря 2029.
Для заказчика это перевод с «держимся на устаревшем runtime» на горизонт поддержки, сопоставимый с несколькими сезонами турнира вперёд.

Как устроено технически (роли слоёв)

Айдентика задаёт лицо турнира на сайте и офлайн-носителях.
Публичный фронт отвечает за композицию, i18n UX, таблицы, матч-страницу, медиа.
CMS / EasyAdmin — за сезоны, команды, протоколы, новости, загрузки.
Инфраструктура — за то, чтобы этот контур вообще имел право жить после 2026 без постоянного «пожара версий».
Стыковка фронта к CMS заложена шаблонными комментариями и слотами (хедер команд, пагинация новостей, фото игрока, категории медиа и т.д.) — чтобы вёрстку можно было ревьюить отдельно от боевых данных и потом посадить на живые сущности.
Must / Not Now
Must (вошло)
- редизайн логотипа и визуальной идентичности под юную аудиторию;
- языковые версии знака RU / BY / EN;
- новый публичный UI ключевых разделов турнира под обновлённый бренд;
- трёхязычный UX на витрине;
- апгрейд PHP → 8.5 и Symfony → 7.4 LTS;
- EasyAdmin 1 → 5 и Doctrine 2 → 3 / DBAL 4;
- обновление критичной экосистемы бандлов (upload, imagine, user, editor, elfinder, translations, recaptcha);
- MySQL 5.7 → 8.0 с переносом данных дампом;
- Nginx → 1.30.6;
- сохранение редакционного контура и турнирных сущностей.
Not Now (осознанно не раздували)
- полный brand-book «на 40 разворотов» вместо рабочего набора носителей;
- переписывание публички в тяжёлый SPA «ради моды»;
- смена CMS-парадигмы на другую админку с нуля;
- выдуманные метрики «ускорили на N%» без замера в проде;
- публикация внутренних admin-URL, схем доступа и боевых персональных данных игроков в портфолио.
Результат для бизнеса и эксплуатации
| Для кого |
Что изменилось |
| Участники / молодая аудитория |
Новый эмоциональный знак: персонаж-футболист, динамика, лайм/зелёная палитра |
| Маркетинг / организаторы |
Айдентика готова к сайту, соцсетям, форме, дипломам и рекламным носителям |
| Зритель / СМИ |
Современная витрина турнира: матчи, таблицы, команды, новости, медиа, языки |
| Редакция / операторы |
Админка на актуальном EasyAdmin и совместимых бандлах |
| IT / безопасность |
Runtime и фреймворк в зоне LTS с горизонтом патчей до 2029 |
| Данные |
MySQL 8 и перенесённый контент — без обнуления истории сезонов |
| Дальнейшая разработка |
Можно наращивать фичи на Symfony 7, а не латать Symfony 3 |
Ключевой продуктовый эффект: турнир получил новое визуальное лицо, обновлённую витрину и жизнеспособную платформу одновременно. Красивый логотип на устаревшем runtime или «технически здоровый» сайт со старым знаком — оба варианта недотягивают до цельного продукта.
Выводы
- Для юношеского турнира айдентика — не «картинка сверху»: она задаёт тон сайта, формы и соцсетей.
- Для спортивного CMS апгрейд Symfony 3 → 7 — это проект миграции контрактов и бандлов, а не «composer update».
- Публичный редизайн лучше вести по карте живых URL и слотов — иначе фронт и backend разъедутся.
- EasyAdmin, Doctrine, upload/imagine/editor — обновлять пакетом: поодиночке они тянут друг друга.
- MySQL 5.7 → 8 через дамп — рабочий путь, если заранее приняты проверки целостности данных.
- Честный scope: бренд, фронт и платформа — разные контуры; в кейсе это надо называть вслух.
FAQ
Зачем трогать логотип, если можно было только сайт?
Для юношеского турнира знак — первый контакт в ленте, на форме и на афише. Старый лого на новом UI выглядел бы чужим; новая айдентика задала палитру и тон всей витрины.
Почему персонаж, а не абстрактный герб?
Концепция строилась на футболе, развитии и энергии молодых игроков. Стилизованный юный футболист читается быстрее «нейтрального» символа и лучше работает на детскую / подростковую аудиторию.
Почему не переписали сайт на React/Next?
Для турнирной витрины с CMS-слотами лёгкий HTML/CSS/JS дал контроль над вёрсткой, i18n и скоростью поставки без лишнего runtime на клиенте. SPA имеет смысл, когда сложность UI/состояния окупает стоимость.
Можно ли было обновить только PHP, оставив Symfony 3?
Краткосрочно — иллюзия стабильности. Реальная поддержка безопасности и экосистемы бандлов упирается в ветку фреймворка. Здесь цель была LTS-горизонт до 2029.
Что было самым рискованным в backend?
Связка Symfony 3→7 + EasyAdmin 1→5 + Doctrine 2→3 при живых данных и редакционных процессах. Пакеты upload/editor/translations без согласованного апгрейда ломают админку даже при «зелёном» composer на ядре.
Сохранились ли старые сезоны и материалы?
Да: MySQL обновлён до 8.0 с миграцией через дамп. Задача была перенести данные, а не обнулить архив турнира.
Кто делал бренд, фронт и backend?
Это разные контуры одной поставки. В портфолио фиксируем все три результата; объём backend (Symfony/Doctrine/инфра) выполнялся в составе команды/подрядного контура, а не «одним чатом».
Что можно показать в портфолио публично?
Логотип, публичный UI и обезличенные схемы стека. Боевые admin-данные, внутренние URL админки и персональные данные игроков — нет.