Skip to content

The blog app with rich auth functionality build from scratch on the PHP On Rails framework

Notifications You must be signed in to change notification settings

IlyaMur/myposts_app

Repository files navigation

MyPosts

CodeSniffer-PSR-12 PHPUnit-Tests Maintainability

🇬🇧 English readme

Содержание

О Приложении

MyPosts - приложение-блог созданное на базе фреймворка PHP On Rails.
Блог создан в процессе обучения, но обладает богатым функционалом.

Деплой приложения осуществлен на сервис Heroku.
MyPosts доступен по адресу - http://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

Приложение доступно для сборки в Docker.

Собрать и запустить приложение

$ make docker-start  

Остановить и удалить контейнеры

$ make docker-stop  

Так же доступны:

$ make docker-bash  # запустить сессию bash в контейнере  
$ make docker-test  # запустить тесты в контейнере 

По умолчанию приложение будет доступно: http://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/.

About

The blog app with rich auth functionality build from scratch on the PHP On Rails framework

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published