Содержание
MyPosts - приложение-блог созданное на базе фреймворка PHP On Rails.
Блог создан в процессе обучения, но обладает богатым функционалом.
Деплой приложения осуществлен на сервис Heroku.
MyPosts доступен по адресу - https://myposts-app.herokuapp.com (на данный момент не доступна загрузка изображений из-за ограничений со стороны AWS S3).
В приложении реализованы:
- Полноценные системы аутентификации и авторизации пользователей.
- Активация аккаунта и сброс пароля по почте (рассылка писем осуществлена на базе сервиса MailJet).
- Хранение данных пользователей, как локально, так и на стороннем сервисе (AWS S3).
- Система комментариев.
- Хэштеги.
- Профили пользователей.
- CAPTCHA и базовая защита от спама.
- Административная составляющая.
Большая часть функционала написана с нуля, готовые решение по возможности избегались.
Основой для представлений был выбран шаблонизатор Twig, как гибкое и безопасное решение с лаконичным синтаксисом.
Установка предлагается в двух вариантах: сборки в Docker и локальной установки.
Прежде всего, необходимо склонировать репозиторий
$ git clone https://github.com/IlyaMur/myposts_app.git
$ cd myposts_app
И подготовить файл .env
$ make env-prepare
Опционально, изменить параметры БД и сервера в файле .env
, а так же изменить данные для сервисов AWS и MailJet.
MYSQL_USER='user'
MYSQL_HOST='mariadb'
APACHE_DEFAULT_PORT='80'
MYSQL_PASSWORD='testpassword'
...
Приложение доступно для сборки в Docker.
Собрать и запустить приложение
$ make docker-start
Остановить и удалить контейнеры
$ make docker-stop
Так же доступны:
$ make docker-bash # запустить сессию bash в контейнере
$ make docker-test # запустить тесты в контейнере
По умолчанию приложение будет доступно: https://localhost
PHP >= 8.0
Для установки зависимостей:
$ make install
В настройках веб-сервера установить root в директории public/
В выбранную СУБД импортировать SQL из файла database/myposts_db.sql
В config/config.php
заполнить данные для доступа к БД, настройки хранения и хэширования.
Настройки конфигурации доступны в файле config.php
Настройки по умолчанию включают в себя:
- Данные подключения к серверу БД.
- Логирование ошибок.
- Возможность выбора между локальным и удаленным хранением пользовательских изображений.
- Установки для вывода/скрытия детализации ошибок.
- Настройка секретного ключа для хэширования токенов.
Для переопределения настроек в конфигурационном файле доступны соответствующие константы.
Не смотря на то, что в процессе написания приложения в первую очередь стояла цель создания функционала с нуля, в MyPosts присутствуют некоторые зависимости:
- Twig Template Engine
- SDK Mailjet
- SDK AWS
- Gregwar/Captcha
- vlucas/phpdotenv
В приложении с нуля реализованы системы регистрации и авторизации пользователей.
Форма аутентификации валидируется как на стороне сервера, так и клиента.
После регистрации на почту пользователя высылается письмо с ссылкой для активации.
Создана возможность сброса существущего пароля на почту. У токена сброса имеется срок годности.
Рассылка писем осуществлена посредством сервиса MailJet и служебного класса Mail, шаблоны для работы с паролями и токенами пользователей доступны в src/Views/Password
Логин пользователя доступен через RememberedLogin. Токен логина так же имеет срок давности.
Для взаимодействия с сессиями и куки используется класс Auth, предоставляющий инструменты для работы с авторизациями пользователей.
Основой блога являются посты пользователей. Они удобно выведены на главной странице, так же доступна пагинация.
Пользователи могут добавлять изображения к постам, редактировать свои посты и комментировать чужие и свои посты.
Так же внимание уделено безопасности и в частности XSS-атакам.
Валидация содержимого поста происходит как на клиенте (посредством библиотеки JS и HTML5-валидации), так и на сервере в модели Post, ошибки возвращаются пользователю.
Пользователи могут оставлять комментарии под своими и чужими постами. Для работы с комментариями создана модель Comment и контроллер Comments.
Реализована и анонимная отправка комментариев, но для этого необходимо пройти проверку через ввод CAPTCHA.
Комментарии пользователя доступны в его профиле.
Комментарии так же валидируются и проверяются на XSS.
Как и любой современный блог MyPosts поддерживает хэштеги. Содержимое поста при добавлении и редактировании парсится на наличие хэштегов.
Логика по работе с хэштегами находится в модели Hashtag.
Последние 10 добавленных хэштегов доступны на главной странице. При клике по хэштегу выводятся связанные с ним посты.
Для хранения изображений доступны два варианта.
- Хранение изображений на базе сервиса AWS S3. С помощью AWS SDK.
- Хранение изображений локально.
Для использования AWS S3 необходимо ввести данные своего аккаунта в файле config.php и установить в константу AWS_STORING
в значение true
.
Для работы воспользоваться классом S3Helper, который использует SDK и предоставляет интерфейс для взаимодействия с облачным хранилищем.
Для локального хранения данных необходимо установить AWS_STORING
в false
. Картинки будут сохраняться в директорию public/upload/
.
Все изображения перед загрузкой на сервер валидируются.
Представления организованы посредством шаблонизатора Twig, который поддерживает наследование шаблонов.
Шаблоны находятся в директории src/Views
, базовый шаблон - base.html.twig.
Для переиспользования кода и улучшения читаемости в директорию src/Views/partials
вынесены часто используемые элементы Представлений.
Для приятного и лаконичного внешнего вида был выбран CSS Framework - Bootstrap.
Администратор блога имеет свою панель управления, взаимодействие с которой происходит в отдельном неймспейсе Ilyamur\PhpMvc\Controllers\Admin
.
Администратор видит подробную информацию о созданных постах и может модерировать их.
Ошибки преобразуются в исключения. Обработчиками обозначены:
set_error_handler('Ilyamur\PhpMvc\Service\ErrorHandler::errorHandler');
set_exception_handler('Ilyamur\PhpMvc\Service\ErrorHandler::exceptionHandler');
При константе SHOW_ERRORS
(настраивается в config.php) равной true
, в случае исключения или ошибки в браузер будет выведена полная детализация.
Если SHOW_ERRORS
присвоено значение false
будет показано лишь общее сообщение из шаблонов 404.html.twig или 500.html.twig в зависимости от ошибки.
Детализированная информация в данном случае будет логироваться в директории logs/
.