Установка дополнительных библиотек через composer
В процессе разработки приложения были установлены следующие библиотеки, путём добавление информации о них в конфигурационный файл composer.json:
· friendsofsymfony/user-bundle - добавляет поддержку системы пользователей с поддержкой базы данных в Symfony. Он обеспечивает гибкую структуру для управления пользователями, которая направлена на решение общих задач, таких как регистрация пользователей с подтверждением, сброс пароля, хранения и управление пользователями с помощью Doctrine [22].
· gregwar/image-bundle - предоставляет управление изображениями и API для Symfony и Twig.
· league/color-extractor – извлекает цвета из изображений и сортирует их по частоте использования.
· sonata-project/admin-bundle – добавляет возможности для генерации и управления административной панелью [24].
· sonata-project/doctrine-orm-admin-bundle – интегрирует sonata-project/admin-bundle с ORM Doctrine.
Для установки всех используемых библиотек использовалась команда «composer install», а для установки fronted-зависимостей sonata-project/admin-bundle команды «bower install ./vendor/sonata-project/admin-bundle/bower.json» и «php bin/console assets:install web/assets».
Вёрстка шаблона, npm, webpack
В качестве менеджера frontend-зависимостей был использован npm. В файле package.json (см. приложение A) был сформирован список библиотек, используемых при вёрстке шаблона. В качестве css-фреймворка выбран «material design light», предоставляющий основные компоненты вёрстки элементов в стиле material design, а также реализующий её адаптивность. Возможность использовать такие возможности, как написание стилей на языке less, использование синтаксиса ECMAScript 6 (классы в JavaScript, импорт / экспорт модулей и т. д.) реализуют библиотеки npm под названием babel, less-loader, file-loader, webpack, css-loader.
Для осуществления жёсткого разграничения между frontend и backend, а также для преобразования less в css и приведения js-файлов к поддерживаемому устаревшими браузерами виду, был использован сборщик frontend webpack, а также организована файловая структура, которая отделяет все файлы стилей, изображения и скрипты от основного backend-функционала приложения. Webpack был установлен через менеджер зависимостей npm и сконфигурирован с учётом доступных библиотек и модулей.
В процессе вёрстки шаблона была использована методология БЭМ (Блок, Элемент, Модификатор), которая позволяет создавать расширяемые и повторно используемые компоненты интерфейса [24]. Все файлы стилей, скрипты, изображения, шрифты хранятся в папке assets/src/ директории проекта.
├───blocks/ -содержит отдельные повторно используемые блоки
│ ├───basket/ -содержит js-код и стили для виджета корзины
│ │ ├───basket.js
│ │ └───basket.less
│ ├───feedback/ -содержит js-код и стили для виджета обратной связи
│ │ ├───feedback.js
│ │ └───feedback.less
│ └───...– содержит блоки для других виджетов на сайте
├───img/- содержит изображения
│ ├───icons/
│ │ ├───...
│ └───logo.png
├───modules/ -содержит скрипты и стили, используемые во всём сайте или в различных блоках
│ └───...
├───admin_common.js – точка входа для страниц административной панели
├───basket.js – точка входа для страницы корзины
├───catalog.js – точка входа для страницы каталога товаров
├───common.js – точка входа, общая для всех публичных страниц
└───... – точки входа для других страниц
Листинг 18. Структура каталога файлов frontend
Таким образом, для каждого маршрута средствами webpack при загрузки страницы подключаются четыре файла – общие файлы css и js, а также используемые только в этом маршруте css и js, определяемые точкой входа. Сгенерированные файлы располагаются в директории web/assets/build/ и исключены из версионного контроля.
В директории src/Difuks/DazzleBundle/Resources/views/ содержатся шаблоны twig – базовые шаблоны публичной части сайта, административной панели, email-сообщения; шаблоны компонентов административной панели, вижетов, страниц публичной части и различные почтовые шаблоны.
Генерация сущностей и форм
База данных была спроектирована таким образом, чтобы отобразить различные типы связей (один ко многим, многие к одному, многие ко многим), использовать различные типы данных, правила валидации и разнообразные возможности ORM Doctrine.
Для реализации поставленной задачи был создан набор сущностей. Все поля и их типы указаны на рисунке 7. Для каждого свойства (за исключением ID) созданы методы для получения и изменения значения (геттеры и сеттеры). Связи между сущностями реализованы с помощью объектно-реляционной модели PostgreSQL, их типы так же указаны на рисунке 7. В некоторых сущностях используется свойство «code», являющееся уникальным, и валидируемое по регулярному выражению – оно должно содержать только символы латиницы, символы «-, _» и цифры. Это поле используется для формирования человекопонятных url.
· Key – ключи игр для добавления в корзину. Содержит вспомогательный метод для получения статуса ключа на основе связанной корзины.
· Game – игры. Содержит вспомогательные методы для получения списка не купленных ключей, обновления рейтинга на основе добавленного отзыва, получения рейтинга в целочисленном формате, получения цены с учётом скидки, определения добавлена ли игра в «избранное» для конкретного пользователя, получения количества отзывов.
· News – новости сайта.
· User – пользователи.
· Genre – жанры игр.
· Image – изображения, используемые в сущностях Game (логотип, скриншоты), News, Genre, Settings.
Рис. 7. Схема реализуемой базы данных
· Basket – корзина пользователя. Содержит вспомогательные методы для получения текущей стоимости корзины с учётом скидок, фактической стоимости после покупки игр с учётом скидок и без, получения количества игр в корзине, добавления и изменения количества игр и ключей в связанной сущности BasketProduct, получения количества конкретной игры, удаления ключей из корзине по определённой игре.
· Review – отзывы об игре.
· Discount – скидки.
· Feedback – обратная связь.
· Settings – настройки сайта.
· Developer – разработчики игр.
· Publisher – издатели игр.
· NewsReview – отзывы о новостях.
· SiteReview – отзывы о сайте.
· Subscribes – подписки на новости сайта.
· BasketProduct – товары корзины (игра и её количество). Содержит вспомогательный метод для определения стоимости с учётом скидки
В приложении B представлена сущность Game в виде класса Doctrine. Генерация сущностей осуществлялась с помощью консольной команды Symfony, а также доработана вручную с учётом реализации необходимых связей, методов и правил валидации.
Помимо самих сущностей были созданы три репозитория, упрощающие процесс выполнения специфичных запросов данных:
· GameRepository – содержит методы для получения общего количества игр в базе данных, максимальной цены, минимальной цены с учётом скидок, минимального и максимального допустимого возраста, игр со скидкой, а также метод для выборки игр по фильтру. Данный репозиторий представлен в приложении C.
· BasketRepository – содержит методы для получения корзины по текущему пользователю, и выборки «старых» корзин.
· BasketProductRepository – содержит метод, переопределяющий базовый метод findAll, с целью изменения направления сортировки (по возрастанию ID).
На основе некоторых сущностей были созданы классы для генерации пользовательских форм, а именно: форма обратной связи (представлена вместе с сущностью Feedback в приложении D), форма изменения данных пользователя и форма регистрации.