Знакомство с проектом
Нам нужно придумать проект, над которым мы будем работать. Это довольно непростая задача. С одной стороны, проект должен быть достаточно большим, чтобы показать все возможности Symfony. С другой стороны, нужен небольшой проект, чтобы нам не наскучило реализовывать похожую функциональность по несколько раз.
Определение цели проекта
Было бы неплохо, если бы проект каким-то образом был связан с Symfony и конференциями, так как книга должна быть опубликована на конференции SymfonyCon 2019 в Амстердаме. Как насчёт гостевой книги или ливр д'ор, как мы называем её по-французски? Мне нравится это старое доброе ощущение разработки гостевой книги в 2019 году!
Наш проект предназначен для сбора отзывов о конференциях. На главной странице разместим список конференций. На странице каждой конференции выведем полезные комментарии. Комментарий будет состоять из небольшого текста и фотографии (по желанию). Кажется, я расписал все требования, чтобы начать разработку.
В проект будет входить несколько приложений. Классическое веб-приложение с использованием HTML, API и SPA-приложение для мобильных устройств.
Обучение на практике
Мы учимся, когда мы что-то делаем. Только так, и никак иначе. Конечно, читать книгу о Symfony — это хорошо, но разрабатывать приложение на своём компьютере по ходу чтения книги — гораздо лучше. Эта книга — нечто особенное, потому что было сделано всё возможное, чтобы вы могли повторять то, что в ней описано: писать код и достигать тех же результатов, что и я, когда разрабатывал приложение у себя.
В книге содержится весь код, который вам предстоит написать, а также все команды для выполнения — одним словом всё, чтобы получить готовое приложение. Все строки кода на своих местах. Все нужные команды прописаны. Это всё уместилось в этой книге благодаря тому, что в современных приложениях на Symfony очень мало шаблонного кода. В основном мы будем писать код, связанный с бизнес-логикой проекта. Всё остальное по большей части уже сделано за нас, либо автоматически генерируется.
Итоговая диаграмма структуры проекта
Несмотря на то, что наш проект кажется простым, мы не станем создавать приложение уровня "Hello World". Это значит, что мы не ограничимся только использованием PHP и взаимодействием с базой данных.
Речь идёт о создании проекта, с которым вы столкнетесь в реальности со всеми вытекающими сложностями. Не верите? Посмотрите на окончательный вариант инфраструктуры проекта:
Одно из главных преимуществ использования фреймворка — небольшое количество кода, необходимого для разработки подобного проекта:
- 20 PHP-классов в директории
src/
для работы сайта; - 550 логических строк PHP-кода (LLOC) по данным PHPLOC;
- 40 строк конфигурационных данных в 3 файлах (с использованием атрибутов и YAML) преимущественно для настройки архитектуры бэкенд-части;
- 20 строк конфигурации инфраструктуры для разработки (Docker);
- 100 строк конфигурации для продакшен-инфраструктуры (Platform.sh);
- 5 установленных переменных окружения.
Готовы к такому испытанию?
Получение исходного кода проекта
Я бы мог по старинке приложить к книге компакт-диск с исходным кодом, так ведь? Но как насчёт использовать Git-репозиторий?
Клонируйте репозиторий гостевой книги на свой компьютер:
1
$ symfony new --version=5.4-1 --book guestbook
Этот репозиторий содержит весь код, который встречается в книге.
Обратите внимание, что мы используем команду symfony new
вместо git clone
, потому что она не только позволяет клонировать репозиторий, который находится в организации the-fast-track
на GitHub по адресу https://github.com/the-fast-track/book-5.4-1
. Также эта команда запускает веб-сервер и контейнеры, применяет миграции базы данных, загружает фикстуры и т.д. После выполнения команды будет запущен сайт, который можно сразу начать использовать.
Полученный код полностью соответствует тому, который присутствует в книге (используйте указанный выше URL-адрес репозитория). Крайне сложно вручную поддерживать один и тот же код одновременно и в книге, и в репозитории. Я пытался ранее, но безуспешно. Я бы даже сказал, что это невозможно. Особенно в книгах, подобной этой, где поэтапно рассказывается, как разрабатывать сайт. Тем более учитывая, что каждая глава зависит от предыдущей, и очередное изменение может не самым лучшим образом отразиться во всех последующих главах.
К счастью, Git-репозиторий для книги автоматически генерируется из содержимого книги. Да, да, вы правильно поняли. Мне нравится всё автоматизировать, поэтому я написал скрипт, который считывает всю книгу и создаёт Git-репозиторий. У такого подхода есть приятный побочный эффект: при обновлении книги скрипт ничего не создаст, если будут противоречивые изменения, либо если я забуду обновить некоторые инструкции. Всё верно, это BDD (Book-Driven Development или разработка через написание книги)!
Навигация по коду
Более того, репозиторий — это не только окончательная версия кода в ветке main
. Скрипт выполняет любое действие, описанное в книге, и в конце каждого раздела фиксирует изменения в репозитории. Вдобавок он помечает каждый шаг и подшаг, чтобы облегчить просмотр соответствующего кода. Разве это не здорово?
Если вам лень, то вы можете получить код нужного шага по его тегу. Например, если вы хотите посмотреть и попробовать в действии код в конце 10 шага, выполните следующую команду:
1
$ symfony book:checkout 10
Как и при клонировании репозитория, вместо команды git checkout
мы используем symfony book:checkout
. Благодаря этой команде, вне зависимости от текущего шага, у вас будет полноценно работающий сайт на указанном шаге. Имейте в виду, все данные и код, а также контейнеры будут удалены после выполнения этой операции.
Вы также можете перейти на любой подшаг:
1
$ symfony book:checkout 10.2
Повторюсь: очень рекомендую самостоятельно писать код. Но если вы столкнулись с затруднениями, попробуйте сравнить ваш код с тем, что в книге.
Не уверены, что всё сделали правильно в подшаге 10.2? Сравните с вашим кодом:
1 2 3 4
$ git diff step-10-1...step-10-2
# And for the very first substep of a step:
$ git diff step-9...step-10-1
Хотите узнать, когда файл был создан или изменён?
1
$ git log -- src/Controller/ConferenceController.php
Вы также можете просматривать изменения, теги и коммиты прямо на GitHub. Это отличный способ скопировать код, особенно если вы читаете бумажное издание книги!