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