Symfony Shop
Выберите язык
| Русский | English | Español | 中文 | Français | Deutsch |
|---|---|---|---|---|---|
| Русский | English | Español | 中文 | Français | Deutsch |
Symfony Shop — учебный интернет-магазин на Symfony. В проекте реализованы каталог товаров, корзина и оформление заказов, личный кабинет, административная часть, API и вход через OAuth. Основные страницы формируются Twig, а Vue 2 используется для отдельных интерактивных элементов интерфейса.
Поддерживаемая среда локальной разработки построена на Docker Compose. PHP, Composer, Node.js, PostgreSQL и Chrome for Testing запускаются внутри контейнеров или устанавливаются в Docker-образ, а основные операции собраны в Makefile. Отдельный сценарий запуска с PHP, Composer и PostgreSQL, установленными непосредственно на хосте, проектом не поддерживается и в CI не проверяется.
Возможности
- каталог категорий и товаров с изображениями, новинками и скидками;
- корзина с проверкой доступности товаров и оформление заказа;
- регистрация, вход, подтверждение email и восстановление пароля;
- личный кабинет пользователя;
- OAuth через Google, Yandex, VKontakte, GitHub, Facebook и LinkedIn;
- отдельные сценарии входа через OAuth, привязки и отвязки внешнего аккаунта;
- административное управление пользователями, категориями, товарами и заказами;
- API на базе API Platform;
- unit-, integration-, functional- и браузерные тесты;
- CI в GitHub Actions на том же Docker-окружении.
Быстрый старт
На хосте нужны Git, Make и Docker с поддержкой Compose. Git LFS рекомендуется для обычного клонирования репозитория; получить большой браузерный архив можно и без него — варианты описаны ниже.
[!NOTE] Make — обычная консольная утилита для Unix-подобных систем. На Linux и macOS проект можно запускать напрямую из терминала. На Windows рекомендуемый вариант — WSL2 вместе с Docker Desktop.
| Команда | Что делает | Примечание |
|---|---|---|
git clone https://github.com/yaleksandr89/symfony-shop.git |
Клонирует репозиторий | |
cd symfony-shop |
Переходит в каталог проекта | |
git lfs install |
Подключает Git LFS | Нужен только при сценарии через Git LFS |
git lfs pull |
Загружает Chrome for Testing | Выполните до make build
|
make init |
Создаёт .env.docker и локальные каталоги |
Не перезаписывает существующий .env.docker
|
make build |
Собирает PHP-образ | В образ входят Chrome и Chromedriver для Panther |
make up |
Запускает PHP-FPM, Nginx и PostgreSQL | |
make composer-install |
Устанавливает PHP-зависимости из composer.lock
|
Composer на хосте не нужен |
make npm-install |
Устанавливает зависимости из package-lock.json
|
Node.js на хосте не нужен |
make assets-build |
Собирает ресурсы фронтенда | |
make migrate |
Применяет Doctrine migrations | |
make demo-init |
Создаёт демонстрационные данные | Только для локальной dev/test среды |
После запуска приложение по умолчанию доступно по адресу http://localhost:8080.
[!IMPORTANT] Проект использует зафиксированный Chrome for Testing
150.0.7871.46. Рекомендуемый способ получить архив —git lfs pull. GitHub source/release archives не включают Git LFS object с Chrome, поэтому при установке из ZIP/tar.gz браузерный архив нужно получить отдельно. Альтернатива Git LFS — скачать нужную версию Chrome for Testing напрямую из официального источника. Точные ссылки, имя файла и SHA-256 приведены в руководстве по запуску.
[!IMPORTANT] Значения из
.env.dockerпередаются в PHP-контейнер как переменные окружения процесса. Если один и тот же ключ задан и там, и в.env.local, значение из.env.dockerимеет приоритет. Подробная схема описана в руководстве по конфигурации.
[!WARNING]
make demo-initпересоздаёт демонстрационные заказы. Не запускайте его в локальной базе, где есть нужные вам данные.
Подробный первый запуск, два способа получить Chrome for Testing и управление контейнерами собраны в руководстве по запуску.
Почта и очередь сообщений
По умолчанию MAILER_DSN=null://null, поэтому приложение не отправляет письма во внешний SMTP-сервис. Письма, отправленные синхронно во время HTTP-запроса, можно посмотреть в панели Mailer Symfony Profiler.
Регистрация и восстановление пароля используют транспорт Messenger async. Маршрутизация в очередь уже настроена, но постоянный обработчик очереди в Docker Compose сейчас не запускается, поэтому такие сообщения обрабатываются только после ручного запуска:
make console CMD='messenger:consume async -vv'
Настройка транспорта, почты и локальных секретов описана в руководстве по конфигурации.
OAuth
Вход через OAuth и привязка внешнего аккаунта к существующему пользователю — разные операции. Совпадение email у провайдера не даёт права автоматически связать внешний аккаунт с уже существующей локальной учётной записью.
Для привязки пользователь сначала входит обычным способом, затем подтверждает текущий пароль и явно начинает OAuth-сценарий из личного кабинета. Отвязка также защищена текущим паролем и CSRF-токеном.
Поддерживаемые провайдеры, переменные окружения, маршруты и правила безопасности подробно описаны в руководстве по OAuth. Общие правила хранения локальных настроек и секретов находятся в руководстве по конфигурации.
Как устроен проект
Браузер
↓
Nginx
↓
Symfony
├─ Controller → Twig → HTML
└─ API Platform → JSON API
↓
Прикладные сервисы / Doctrine
↓
PostgreSQL
Основной код сгруппирован по областям Account, Catalog и Commerce. Административная часть, OAuth и SEO оформлены как внутренние Symfony-бандлы. Vue 2 используется для отдельных интерактивных компонентов, а не как самостоятельное SPA.
Карта каталогов, маршрутизация, API Platform, Doctrine и границы фронтенда разобраны в описании архитектуры.
Проверки
| Команда | Что делает | Примечание |
|---|---|---|
make check |
Запускает ESLint, проверку PHP-CS-Fixer и PHPStan | Тесты сюда не входят |
make test-unit |
Запускает unit-тесты | |
make test-integration |
Запускает integration-тесты | |
make test-functional |
Запускает functional-тесты | |
make test-functional-panther |
Запускает браузерные тесты через Panther | Chrome уже находится в PHP-образе |
make test-all CONFIRM=testdb |
Запускает полный набор тестов | Пересоздаёт тестовую БД |
make coverage CONFIRM=testdb |
Показывает покрытие PHP/PHPUnit в терминале | Panther не входит в отчёт |
make coverage-html CONFIRM=testdb |
Создаёт HTML- и Clover-отчёты |
var/coverage/html, var/coverage/clover.xml
|
Полный список Make-команд, устройство тестовой базы и состав CI приведены в руководстве по разработке.
В планах
-
Локальная почтовая среда. Добавить отдельный почтовый сервис с веб-интерфейсом для просмотра писем и постоянный обработчик очереди Messenger, чтобы сообщения транспорта
asyncобрабатывались автоматически. -
Inertia.js и Vue 3. Перевести взаимодействие серверной и клиентской частей на Inertia.js и Vue 3. Заодно хочу пересмотреть локализацию: в зависимости от объёма изменений, возможно, получится отказаться от обязательного префикса
/{_locale}в URL. Это решу уже при проектировании нового фронтенда. - Административная часть. После миграции фронтенда существенно расширить возможности управления магазином из административного интерфейса.
Обратная связь
- воспроизводимые ошибки — GitHub Issues;
- вопросы и идеи — GitHub Discussions.
История проекта
2026 — подготовка v3.0.0
- Проект переведён на Docker Compose как основную среду разработки. Добавлены единый Makefile, воспроизводимый bootstrap, PostgreSQL в Docker, demo-данные, Xdebug и APCu.
- CI перенесён в GitHub Actions и построен вокруг того же Docker-backed workflow, который используется локально.
- Backend-стек последовательно обновлён до PHP 8.5, Symfony 8.1, API Platform 4.3, Doctrine ORM 3 / DBAL 4, PHPUnit 13 и PHPStan 2.
- Существенно переработаны безопасность и бизнес-границы корзины, оформления заказа, API, регистрации, восстановления пароля и OAuth.
- OAuth расширен поддержкой Facebook и LinkedIn; сценарии входа, регистрации, привязки и отвязки аккаунтов разделены и защищены отдельными проверками.
- Удалены Selenium, GeckoDriver, Java tooling и Deployer. Браузерные тесты переведены на Panther и Chrome for Testing; архив Chrome хранится через Git LFS.
- Архитектура приложения переработана: выделены модули
Account,Catalog,Commerce, а такжеAdminBundle,OAuthBundleиSeoBundle; централизованы маршруты и общий OAuth callback-поток. - Пересобран тестовый контур, добавлены Docker-backed quality gates и команды coverage.
- Полностью переработана документация проекта, добавлены инструкции по запуску, конфигурации, разработке, OAuth и архитектуре.
- Лицензия проекта унифицирована как MIT; добавлены GitHub Issues/Discussions, шаблоны Pull Request, contribution guide и security policy.
2024 — v2.3.0
- Symfony обновлён до 6.4.9.
- PHPUnit обновлён с 9 до 11, DAMA Doctrine Test Bundle — до 8 версии; переработаны существующие тесты.
- Продолжен переход с аннотаций на PHP attributes и устранение замечаний PHPStan.
- Обновлены Selenium, ChromeDriver и GeckoDriver.
- Добавлены примеры конфигурации Nginx и Supervisor, инструкции по Deployer и переводы README.
2023 — v2.1.1 / v2.2.0
- Symfony обновлён до 6.3.1, обновлены сторонние зависимости и устранены deprecation-уведомления first-party кода.
- Проведён очередной этап рефакторинга и исправлений по PHPStan.
- Обновлена конфигурация Deployer.
- CircleCI удалён после прекращения работы сервиса для пользователей из России.
2022 — v1.2.0 / v2.0.0 / v2.1.0
- Сформирован основной функционал интернет-магазина.
- Добавлена OAuth-авторизация через Google, Yandex, VKontakte и GitHub.
- Symfony последовательно обновлён с 5.4 до 6.0.
- В личном кабинете появились привязка и отвязка внешних OAuth-аккаунтов.
- Добавлена защита от повторного использования одной внешней учётной записи разными пользователями.
2021 — начало проекта
- Создан первый вариант Symfony Shop на Symfony 5.3 с PostgreSQL.
Если проект оказался полезен, поставьте звезду на GitHub — так его будет проще найти другим разработчикам.
