Знайомство з проектом
Нам потрібно знайти проект над яким можна працювати. Це досить складне завдання, тому що нам потрібно знайти проект досить великий, щоб повністю охопити Symfony, але одночасно він повинен бути досить маленьким; я не хочу, щоб ви нудьгували, імплементуючи однотипні функції.
Розкриття проекту
Було б непогано, якби проект був якимось чином пов’язаний із Symfony і його спільнотою. Оскільки ми щороку організовуємо чимало онлайн-конференцій і конференцій особистого характеру, як щодо гостьової книги? A livre d'or, як ми кажемо по-французьки. Мені подобається старомодне й застаріле відчуття розробки гостьової книги у 21 столітті!
Отже, є. Суть проекту полягає в отриманні відгуків про конференції: список конференцій на головній сторінці, сторінка для кожної конференції, повна приємних коментарів. Коментар складається з невеликого тексту та додаткової фотографії, зробленої під час конференції. Я думаю, що я тільки що записав всі специфікації, які нам потрібні, щоб почати роботу.
Наш проект буде містити декілька застосунків. Це буде традиційний веб-сайт з HTML на фронт-енді, API, та SPA для мобільних пристроїв. Як вам це?
Практичне навчання
Практика є найкращим вчителем. Крапка. Приємно читати книгу про Symfony. Але розробка застосунку на вашому персональному комп'ютері під час читання книги про Symfony ще краще. Ця книга дуже особлива, тому що було зроблено все можливе для того, щоб ви могли, писати код і бути впевненими, що отримаєте ті ж результати, що і у мене на моєму комп'ютері, коли я писав код вперше.
Книга містить весь код, який вам потрібно написати, і всі команди, які ви маєте виконати, щоб отримати кінцевий результат. Нічого з кодової бази не пропущено. Перелічено абсолютно всі команди. Все це можливо завдяки тому, що сучасні застосунки Symfony мають дуже мало шаблонного коду. Більша частина коду, яку ми напишемо разом, буде присвячена бізнес-логіці проекту. Все інше в основному автоматизовано або генерується автоматично для нас.
Підсумкова діаграма структури проекту
Навіть якщо ідея проекту здається простою, ми не збираємося будувати проект, подібний "Hello World". Ми будемо використовувати не тільки PHP і базу даних.
Мета полягає в тому, щоб створити проект з деякими складнощами, які ви можете зустріти в реальному житті. Хочете докази? Погляньте на кінцеву інфраструктуру проекту:
Однією з найбільших переваг використання фреймворку є невелика кількість коду, необхідного для розробки такого проекту:
- 20 PHP-класів у каталозі
src/
для веб-сайту; - 550 логічних рядків коду PHP (LLOC), як звітує PHPLOC;
- 40 рядків налаштувань конфігурації у 3-х файлах (за допомогою атрибутів і YAML), в основному для налаштування backend'у;
- 20 рядків конфігурації інфраструктури розробки (Docker);
- 100 рядків конфігурації для продакшн-інфраструктури (Platform.sh);
- 5 явних змінних середовища.
Готові до виклику?
Отримання вихідного коду проекту
В продовження теми старомодності, я міг би створити компакт-диск з вихідним кодом, чи не так? Але як ви ставитеся до компаньйона — Git-репозиторія, натомість?
Клонуйте репозиторій гостьової книги на ваш локальний комп'ютер:
1
$ symfony new --version=5.4-1 --book guestbook
У цьому репозиторії міститься весь код, який зустрічається у цій книзі.
Зверніть увагу, що ми використовуємо команду symfony new
замість git clone
, тому, що ця команда робить більше, ніж просто клонує репозиторій (розміщений на Github під організацією the-fast-track
https://github.com/the-fast-track/book-5.4-1
). Команда також запускає веб-сервер, контейнери, проводить міграцію бази даних, запускає фікстури, та інше... Після виконання команди веб-сайт повинен бути запущений і готовий до використання.
Код на 100% сходиться з тим, який міститься у книзі (використовуйте точну 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. Це чудовий спосіб скопіювати/вставити код, якщо ви читаєте паперову книгу!