Создание галереи изображений с помощью Symfony Flex: настройка

Эта статья является частью серии материалов о создании галереи с несколькими изображениями для оценки производительности и оптимизации. (Смотрите репозиторий здесь). В этой части мы выполним базовую настройку проекта.

В этой статье будут рассмотрены настройка и организация файлов для нашего проекта на Symfony Flex. Я также предоставлю несколько советов, приемов и вспомогательных скриптов, которые ускорят разработку.

Содержание

Что мы создаем?

В этой серии статей мы будем создавать простой блог с галереей изображений. На нем пользователи смогут зарегистрироваться, загружать изображения и создавать простые общедоступные галереи изображений с описаниями, написанными в формате Markdown.

Мы будем использовать новые Symfony Flex и Homestead. А также шаблонизатор Twig, формы Symfony и Doctrine ORM с UUID в качестве первичных ключей.

Объекты и маршруты будут использовать аннотации. Мы реализуем простую аутентификацию по электронной почте и паролю. Затем подготовим информацию для заполнения базы данных.

Начало работы с приложением

Чтобы работать с примером, который мы подготовили, сделайте следующее:

  • Создайте пустую базу данных с названием blog.
  • Клонируйте репозиторий проекта с GitHub.
  • Запустите composer install.
  • Обновите файл .env в корневом каталоге проекта, указав правильную строку подключения к базе данных (то есть обновите учетные данные).
  • Запустите скрипт инициализации базы данных ./bin/refreshDb.sh и подождите, пока он создаст несколько галерей изображений.
  • Откройте приложение в браузере и наслаждайтесь.

После выполнения bin/refreshDb.sh вы должны увидеть домашнюю страницу сайта.

Вы можете войти в приложение с помощью логина user1@mailinator.com и пароля 123456. Изучите класс фикстуры (тестовых данных) LoadUserData для получения информации о сгенерированных пользователях.

Начинаем с нуля

В этом разделе описывается, как создать новый проект с нуля. Вы можете посмотреть пример кода приложения.

После создания нового проекта на основе symfony/skeleton с помощью команды

composer create-project "symfony/skeleton:^3.3" multi-user-gallery-blog

… мы можем установить минимальный уровень стабильности для dev-окружения:

composer config minimum-stability dev

Затем нам понадобятся дополнительные пакеты. На некоторые из них мы ссылаемся через их псевдонимы – новый функционал, доступный в Flex:

composer req annotations security orm template asset validator ramsey/uuid-doctrine

Зависимости, используемые только в среде разработки, подключаются с флагом --dev:

 composer req --dev fzaninotto/faker doctrine/Doctrine-Fixtures-Bundle

Flex выполняет за нас много работы. Поэтому большинство библиотек  уже зарегистрировано и настроено с параметрами по умолчанию.

Зайдите в каталог config. Здесь в файле composer.json можно проверить все зависимости, используемые в проекте.

Маршруты определяются аннотациями, поэтому следующие данные будут автоматически добавлены в config/routes.yaml:

controllers:
  resource: ../src/Controller/
  type: annotation

База данных, скрипты и фикстуры

Настройте переменную среды DATABASE_URL, чтобы установить рабочее соединение с базой данных. При использовании Homestead Improved вы получаете настроенную базу данных с именем homestead, логином паролем (homesteadsecret). Схема базы данных может быть сгенерирована из существующих объектов:

./bin/console doctrine:schema:create

Если это не работает, попробуйте запустить консоль, вызвав бинарный файл PHP. Например, так:

php bin/console doctrine:schema:create

Для удаления базы данных запустите приведенную ниже команду:

./bin/console doctrine:schema:drop --full-database --force

Создавайте тестовые данные

Я считаю Doctrine Fixture Bundle отличным инструментом для обработки данных. С его помощью вы можете контролировать порядок записей, делиться объектами (через ссылки) между скриптами и получать доступ к контейнеру сервиса.

Стандартная конфигурация сервисов Symfony не разрешает публичный доступ к сервисам. В качестве рекомендованной практики предлагается включить все зависимости.

Нам понадобятся некоторые службы для скриптов заполнения БД. Поэтому я сделаю все службы AppServices общедоступными, добавив приведенный ниже код в config/services.yaml:

AppService:
  resource: '../src/Service/*'
  public: true

Я также использую Faker для получения случайных, но реалистичных данных (имен, предложений, текстов, изображений, адресов и т. д.). Взгляните на скрипт для заполнения галерей случайными изображениями.

Обычно я объединяю команды для удаления схемы БД, создания новой схемы БД, загрузки фикстур данных и других повторяющихся задач в единый скрипт оболочки bin/refreshDb.sh. Это позволяет легко сгенерировать схему и загрузить случайные данные:

# Удаление схемы
./bin/console doctrine:schema:drop --full-database --force

# Создание схемы
./bin/console doctrine:schema:create

# Загрузка фикстур
./bin/console doctrine:fixtures:load -n --fixtures src/DataFixtures/ORM

# Установка ресурсов
./bin/console assets:install --symlink

# Очистка кеша
./bin/console cache:clear

Можно утверждать, что случайно сгенерированные данные не могут воспроизводить разные крайние случаи. Нужно обеспечить, чтобы все крайние случаи охватывались вашими тестовыми данными.

Контроллеры, шаблоны и службы

Классы контроллеров расположены в каталоге srcController. Они не расширяют существующий класс Controller, предоставляемый FrameworkBundle. Все зависимости включаются через конструкторы. Это делает код менее связанным и простым для тестирования.

В новой структуре каталогов Symfony шаблоны расположены в templates.
Я создал основной шаблон base.html.twig, который определяет базовую структуру HTML и ссылается на внешние ресурсы.

Другие шаблоны расширяют и переопределяют его блоки (например, таблицы стилей, тело, заголовок, содержимое, JavaScript).

На локальные ресурсы мы ссылаемся с помощью функции Twig asset. Другие шаблоны расположены в подкаталогах внутри каталога src/templates.

Службы автоматически регистрируются и настраиваются по умолчанию в конфигурации Symfony. Поэтому не нужно вручную настраивать расширения Twig с фильтрами для поддержки Markdown и генерировать URL-адреса для объектов изображения, расположенных в src/Twig.

Управление исходным кодом / Контроль версий

Symfony Flex управляет проектом .gitignore по умолчанию, добавляя известные файлы и папки пакета в список игнорируемых. Например, Flex добавил бы в список игнорирования для symfony/framework-bundle следующие файлы:

.env
/public/bundles/
/var/
/vendor/

Мы будем хранить загруженные файлы в каталоге var/uploads, поэтому нужно создать его. Вместо того чтобы делать это вручную можно использовать специальную команду для события post-install-cmd в разделе скриптов composer.json . И затем указать Composer запускать ее для нас (например, "mkdir -p var/uploads").

Теперь нужно добавить остальные каталоги и файлы, которые мы хотим игнорировать, в .gitignore. Но уже за пределами комментариев и раздела, управляемого Flex.

Другие советы и устранение неполадок

  • Проверьте файл Homestead.yaml на наличие переменных среды. Если у вас уже есть переменная APP_ENV, Symfony не будет загружать ее из файла .env. Лучше всего для обеспечения безопасности закомментировать раздел Homestead.yaml APP_ENV.
  • Очистка кэша на компьютере  с Vagrant может завершиться сбоем из-за прав доступа. Можно просто запустить очистку кеша вручную с помощью команды sudo rm -rf var/cache/*.

Заключение

В этой статье мы настроили проект с объектами, контроллерами, шаблонами и вспомогательными скриптами. База данных заполнена сгенерированным контентом. Поэтому пользователи могут регистрироваться и создавать свои галереи.

В следующей статье мы покажем, как заполнить базу более объемным набором данных для проверки производительности приложения. А так же, как настроить простой набор тестов и CI на основе Docker.

Данная публикация представляет собой перевод статьи «Building an Image Gallery Blog with Symfony Flex: the Setup» , подготовленной дружной командой проекта Интернет-технологии.ру