Назад к портфолио

Кубок развития: айдентика, сайт турнира и апгрейд платформы на Symfony 7 / PHP 8

Кейс: редизайн логотипа и айдентики «Кубка развития», новый публичный фронт и апгрейд платформы — PHP 7→8.5, Symfony 3.3→7.4, EasyAdmin, Doctrine, MySQL 8.

Задача

«Кубок развития» — международный юношеский турнир с живой CMS: сезоны, матчи, протоколы, новости и три языка. Для зрителя сайт работал, но знак и визуальный язык уже не попадали в ожидания молодой аудитории, публичная витрина выглядела устаревшей, а PHP/Symfony и админ-экосистема вышли из зоны комфортной поддержки. Нужно было обновить айдентику, собрать современный фронт под неё и поднять платформу на актуальный LTS — с переносом данных и без ломки привычных URL. Всё это шло параллельными контурами бренда, публичного сайта и backend, а не одним «переписать всё с нуля».

Наше решение

Задача на входе

«Кубок развития» — международный юношеский турнир в Минске с длинной историей и устоявшимся контуром: сезоны, команды, матчи, протоколы, новости, мультимедиа, трёхязычность (RU / BY / EN).

На проде уже работала CMS-платформа на старом стеке. Для зрителя сайт существовал. Для бренда, UX и эксплуатации картина была типичной для зрелого спортивного продукта:

  • логотип и визуальный язык отставали от современной спортивной культуры и ожиданий юной аудитории;
  • runtime и фреймворк вышли из зоны комфортной поддержки;
  • админка и пакеты вокруг неё жили на версиях mid-2010s;
  • публичная витрина нуждалась в современном editorial UX без ломки маршрутов и редакционных процессов;
  • данные (команды, сезоны, медиа) нельзя было «обнулить ради красоты».

Нужно было не витрину ради витрины, а связку:

  1. обновить логотип и визуальную идентичность, сохранив узнаваемость турнира;
  2. собрать публичный слой как турнирный медиапродукт под новую айдентику;
  3. провести крупный апгрейд backend / инфраструктуры с переносом данных;
  4. сохранить рабочие сущности турнира и привычные 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, акцент на гербы команд, лого и фото матчей, а не на «карточки ради карточек».

The football cup on a laptop screen

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» на горизонт поддержки, сопоставимый с несколькими сезонами турнира вперёд.

Platform gap – before and after


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

Development Football Cup

Айдентика задаёт лицо турнира на сайте и офлайн-носителях.
Публичный фронт отвечает за композицию, 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 или «технически здоровый» сайт со старым знаком — оба варианта недотягивают до цельного продукта.


Выводы

  1. Для юношеского турнира айдентика — не «картинка сверху»: она задаёт тон сайта, формы и соцсетей.
  2. Для спортивного CMS апгрейд Symfony 3 → 7 — это проект миграции контрактов и бандлов, а не «composer update».
  3. Публичный редизайн лучше вести по карте живых URL и слотов — иначе фронт и backend разъедутся.
  4. EasyAdmin, Doctrine, upload/imagine/editor — обновлять пакетом: поодиночке они тянут друг друга.
  5. MySQL 5.7 → 8 через дамп — рабочий путь, если заранее приняты проверки целостности данных.
  6. Честный 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 админки и персональные данные игроков — нет.

Результат

Турнир получил новое визуальное лицо: логотип и айдентика под юную аудиторию, с версиями RU / BY / EN для сайта и носителей. Публичная витрина собрана заново — матчи, таблицы, команды, новости и медиа в актуальном UX и трёх языках. Платформа ушла с PHP 7 / Symfony 3 на PHP 8.5 / Symfony 7.4 LTS, с обновлённой админкой, MySQL 8 и горизонтом security-патчей до 2029. Итог — цельный продукт: бренд, сайт и runtime обновлены вместе, без обнуления истории сезонов.