Данное приложение является реализацией задачи:
Условия задачи:
На страницу вывести форму с полями input:email, select:категория из http://www.icndb.com/api/ При заполнении формы на емейл нужно отправить письмо с темой "Случайная шутка из %имя категории%"
В теле письма должна быть случайная шутка из этой категории Эту же шутку нужно записать в файл на диске
Требования:
Работу с апи нужно реализовать самому с использованием http://docs.guzzlephp.org/en/stable/
- PHP ^7.1.3+
- Symfony 4.2+
- SQLite3
# Установка зависимостей
composer install
# Создание БД и создание схем
./bin/console doctrine:database:create
./bin/console doctrine:schema:create
# Скачивание категорий
./bin/console app:download-categories
# Запуск локального сервера
./bin/console server:run
После создания "Заявки на шутку" через интерфейс, запустить через консоль команду ./bin/console app:request:workflow-process
./bin/phpunit
Приложение основано на Symfony 4.2. В качестве БД используется sqlite, как файловое хранилище, но с преимуществом работы через Doctrine.
Для отправки почты используется symfony/swiftmailer-bundle. Данные для подключения smtp сервара, в файле .env.
Перед использованием приложения необходимо запустить команду app:download-categories
скачивается категории для отображения пользователю.
Каждая отправка от пользователя представлена в качестве "Заявки на шутку" \App\Entity\JokeRequest
Для данной сущности реализован workflow. STATUS_NEW->JOKE_CHOOSEN->EMAIL_SENDED
.
Работу предлагается реализовать через cron, путем добавления расписания команды app:request:workflow-process
. Данная команда работает через стратегии, обрабатывает заявку по необходимому workflow, в зависимости от статуса.
Отправку почты можно проверить через функциональный тест \App\Tests\Command\RequestWorkflowProcessCommand\RequestJokeChoosenStrategyTest::testHandle
В качестве оптимизации приложения:
- Вместо workflow и БД, использовать RabbitMQ и Consumers, для моментальной отправки почты
- В тестах добавить бандл для работы с файловыми фикстурами, типа alice fixtures. Но т.к фикстур мало, то создавал сущности через
entityManager