Статьи

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

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


Время от времени вы должны создавать новый репозиторий проектов, запускать эту команду git init локально и запускать новый удивительный проект. Я должен признать, что мне нравится чувство начала чего-то нового; это как приключение!

Лао Цзы сказал:

Путешествие в тысячу миль начинается с одного шага

Мы можем думать о настройке проекта как о самом первом шаге нашего путешествия в тысячу миль (пользователей!). Мы не уверены, где именно мы окажемся, но это будет весело!

Мы также должны помнить совет проф. Дональд Кнут:

Преждевременная оптимизация — корень всего зла (или, по крайней мере, большей его части) в программировании.

Наш путь к стабильному, надежному и высокопроизводительному веб-приложению начнется с простого, но функционального приложения — так называемого продукта с минимальной жизнеспособностью (MVP). Мы наполним базу данных случайным контентом, сделаем несколько тестов и будем постепенно повышать производительность. Каждая статья в этой серии будет контрольно-пропускной пункт в нашем путешествии!

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

Что мы строим?

Перед началом любого проекта у вас должно быть четкое видение конечного пункта назначения. Куда ты направляешься? Кто будет использовать ваше приложение и как? Какие основные функции вы строите? Получив эти знания, вы можете подготовить свою среду, сторонние библиотеки и погрузиться в разработку следующей важной задачи.

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

Мы будем использовать новые Symfony Flex и Homestead (убедитесь, что вы прочитали учебники по ним, так как мы не будем их здесь описывать). Мы выбрали Flex, потому что Symfony 4 только собирается выпустить (если он еще этого не сделал, к тому времени, когда вы читаете это), потому что он бесконечно легче старой версии и идеально подходит для пошаговой оптимизации, и это также естественный шаг в развитии самой популярной корпоративной среды PHP.

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

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

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

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

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

  • Настройте пустую базу данных под названием «блог».
  • Клонировать репозиторий проекта из GitHub.
  • Запустите composer install .
  • Если вы сейчас откроете приложение в своем браузере, вы должны увидеть исключение относительно отсутствующих таблиц базы данных. Это нормально, так как мы еще не создали ни одной таблицы.
  • Обновите файл .env в корневом каталоге вашего проекта, .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 будет автоматически добавлено config/routes.yaml :

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

База данных, сценарии и приспособления

Сконфигурируйте переменную среды DATABASE_URL (например, отредактировав файл .env ), чтобы установить работающее соединение с БД. Если вы используете наш собственный Homestead Improved (рекомендуется), у вас есть настроенная база данных, называемая homestead с пользователем / pass homestead / secret . Схему БД можно сгенерировать из существующих сущностей, выполнив:

 ./bin/console doctrine:schema:create 

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

 php bin/console doctrine:schema:create 

Если этот шаг был выполнен нормально в разделе «Начало работы с приложением» выше, вы должны увидеть вновь созданные таблицы в базе данных (для объектов « Галерея» , « Изображение» и « Пользователь» ).

Если вы хотите удалить схему базы данных, вы можете запустить:

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

Фальсифицируйте, пока не сделаете!

Я не могу представить себе разработку приложения сегодня без фиксаторов данных (т. Е. Сценариев для заполнения базы данных). С помощью нескольких простых сценариев вы можете наполнить свою базу данных реалистичным содержимым, что полезно, когда речь идет о быстрой разработке и тестировании приложений, но это также требование для работоспособного конвейера CI.

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

Стандартная конфигурация сервисов Symfony не разрешает публичный доступ к сервисам, так как рекомендуется внедрить все зависимости. Нам понадобятся некоторые службы в наших приборах, поэтому я собираюсь сделать все службы в App\Services общедоступными, добавив следующее в config/services.yaml :

 App\Service\: resource: '../src/Service/*' public: true 

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

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

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

 # Drop schema ./bin/console doctrine:schema:drop --full-database --force # Create schema ./bin/console doctrine:schema:create # Load fixtures ./bin/console doctrine:fixtures:load -n --fixtures src/DataFixtures/ORM # Install assets ./bin/console assets:install --symlink # Clear cache ./bin/console cache:clear 

Убедитесь, что вы ограничиваете выполнение этого скрипта на производстве, или вы собираетесь повеселиться в один прекрасный момент.

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

Каждый раз, когда вы обнаруживаете крайний случай, вызывающий ошибку, убедитесь, что вы добавили ее в фикстуры данных. Это поможет вам построить более надежную систему и предотвратить подобные ошибки в будущем.

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

Классы контроллеров расположены в каталоге src\Controller и не расширяют существующий класс Controller предоставляемый FrameworkBundle . Все зависимости внедряются через конструкторы, что делает код менее связанным и более простым для тестирования. Я не люблю «магию» для простых вещей!

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

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

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

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

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

Надеюсь, вы уже знаете основы Git и понимаете, как работает .gitignore .

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 . Лучше всего APP_ENV раздел APP_ENV в Homestead.yaml чтобы быть в безопасности.
  • Очистка кэша на вашем компьютере Vagrant может завершиться неудачей из-за разрешений. Вы можете просто запустить sudo rm -rf var/cache/* чтобы очистить кэш вручную, или, если это не удастся, очистить его снаружи виртуальной машины на хост-компьютере в общей папке.

Вывод

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

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