An open API service indexing awesome lists of open source software.

https://github.com/ilyamur/myposts_app

The blog app with rich auth functionality build from scratch on the PHP On Rails framework
https://github.com/ilyamur/myposts_app

authentication aws-api blog-app from-scratch mailjet-api

Last synced: 7 months ago
JSON representation

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

Awesome Lists containing this project

README

          

# MyPosts

![CodeSniffer-PSR-12](https://github.com/IlyaMur/myposts_app/workflows/CodeSniffer-PSR-12/badge.svg)
![PHPUnit-Tests](https://github.com/IlyaMur/myposts_app/workflows/PHPUnit-Tests/badge.svg)
[![Maintainability](https://api.codeclimate.com/v1/badges/0273c0de648a6f356cf3/maintainability)](https://codeclimate.com/github/IlyaMur/myposts_app/maintainability)

**[πŸ‡¬πŸ‡§ English readme](https://github.com/IlyaMur/myposts_app/blob/master/README_en.md)**

**Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅**
- [О ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ](#ΠΎ-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ)
- [Установка](#установка)
- [Π‘Π±ΠΎΡ€ΠΊΠ° Π² Docker](#сборка-Π²-docker)
- [Установка локально](#установка-локально)
- [ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ](#конфигурация)
- [Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ](#ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ)
- [Как Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅](#ΠΊΠ°ΠΊ-Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅)
- [БистСмы Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ](#систСма-Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ-ΠΈ-Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ)
- [Π Π°Π±ΠΎΡ‚Π° с постами](#Ρ€Π°Π±ΠΎΡ‚Π°-с-постами)
- [Π Π°Π±ΠΎΡ‚Π° с коммСнтариями](#Ρ€Π°Π±ΠΎΡ‚Π°-с-коммСнтариями)
- [Π₯ΡΡˆΡ‚Π΅Π³ΠΈ](#Ρ…ΡΡˆΡ‚Π΅Π³ΠΈ)
- [Π₯Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ](#Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅-ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ)
- [Π¨Π°Π±Π»ΠΎΠ½Ρ‹](#ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹)
- [Административная ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ](#административная-ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ)
- [Ошибки](#ошибки)

## О ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ

**MyPosts** - ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅-Π±Π»ΠΎΠ³ созданноС Π½Π° Π±Π°Π·Π΅ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° [PHP On Rails](https://github.com/IlyaMur/php_on_rails_mvc).
Π‘Π»ΠΎΠ³ создан Π² процСссС обучСния, Π½ΠΎ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ Π±ΠΎΠ³Π°Ρ‚Ρ‹ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΠΎΠΌ.

Π”Π΅ΠΏΠ»ΠΎΠΉ прилоТСния осущСствлСн Π½Π° сСрвис Heroku.
MyPosts доступСн ΠΏΠΎ адрСсу - http://myposts-app.herokuapp.com (Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π΅ доступна Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈΠ·-Π·Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ со стороны AWS S3).

Π’ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹:
- ΠŸΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹Π΅ систСмы Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.
- Активация Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π° ΠΈ сброс пароля ΠΏΠΎ ΠΏΠΎΡ‡Ρ‚Π΅ (рассылка писСм осущСствлСна Π½Π° Π±Π°Π·Π΅ сСрвиса MailJet).
- Π₯Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, ΠΊΠ°ΠΊ локально, Ρ‚Π°ΠΊ ΠΈ Π½Π° стороннСм сСрвисС (AWS S3).
- БистСма ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π².
- Π₯ΡΡˆΡ‚Π΅Π³ΠΈ.
- ΠŸΡ€ΠΎΡ„ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.
- CAPTCHA ΠΈ базовая Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ спама.
- Административная ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ.

Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π° написана с нуля, Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ возмоТности избСгались.
Основой для прСдставлСний Π±Ρ‹Π» Π²Ρ‹Π±Ρ€Π°Π½ ΡˆΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°Ρ‚ΠΎΡ€ [Twig](https://twig.symfony.com/), ΠΊΠ°ΠΊ Π³ΠΈΠ±ΠΊΠΎΠ΅ ΠΈ бСзопасноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ с Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½Ρ‹ΠΌ синтаксисом.

![Главная страница](https://i.imgur.com/AUtFld3.png)

## Установка

Установка прСдлагаСтся Π² Π΄Π²ΡƒΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°Ρ…: сборки Π² Docker ΠΈ локальной установки.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ

$ git clone https://github.com/IlyaMur/myposts_app.git
$ cd myposts_app

И ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» `.env`

$ make env-prepare

ΠžΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π‘Π” ΠΈ сСрвСра Π² Ρ„Π°ΠΉΠ»Π΅ `.env`, Π° Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ для сСрвисов AWS ΠΈ MailJet.

```dotenv
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](config/config.php)

Настройки ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π² сСбя:
- Π”Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ сСрвСру Π‘Π”.
- Π›ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ошибок.
- Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.
- Установки для Π²Ρ‹Π²ΠΎΠ΄Π°/скрытия Π΄Π΅Ρ‚Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ошибок.
- Настройка сСкрСтного ΠΊΠ»ΡŽΡ‡Π° для Ρ…ΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ².

Для пСрСопрСдСлСния настроСк Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ доступны ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ константы.

### Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ

НС смотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² процСссС написания прилоТСния Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ стояла Ρ†Π΅Π»ΡŒ создания Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π° с нуля, Π² MyPosts ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ зависимости:

- Twig Template Engine
- SDK Mailjet
- SDK AWS
- Gregwar/Captcha
- vlucas/phpdotenv

## Как Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

### БистСма Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ

Π’ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ с нуля Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ систСмы рСгистрации ΠΈ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

Π€ΠΎΡ€ΠΌΠ° Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ валидируСтся ΠΊΠ°ΠΊ Π½Π° сторонС сСрвСра, Ρ‚Π°ΠΊ ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.
ПослС рСгистрации Π½Π° ΠΏΠΎΡ‡Ρ‚Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ высылаСтся письмо с ссылкой для Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΠΈ.
Π‘ΠΎΠ·Π΄Π°Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ сброса сущСствущСго пароля Π½Π° ΠΏΠΎΡ‡Ρ‚Ρƒ. Π£ Ρ‚ΠΎΠΊΠ΅Π½Π° сброса имССтся срок годности.

Рассылка писСм осущСствлСна посрСдством сСрвиса MailJet ΠΈ слуТСбного класса [Mail](src/Service/Mail.php), ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с паролями ΠΈ Ρ‚ΠΎΠΊΠ΅Π½Π°ΠΌΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ доступны Π² [src/Views/Password](src/Views/Password)

Π›ΠΎΠ³ΠΈΠ½ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ доступСн Ρ‡Π΅Ρ€Π΅Π· [RememberedLogin](src/Models/RememberedLogin.php). Π’ΠΎΠΊΠ΅Π½ Π»ΠΎΠ³ΠΈΠ½Π° Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ срок давности.
Для взаимодСйствия с сСссиями ΠΈ ΠΊΡƒΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ класс [Auth](src/Service/Auth.php), ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ инструмСнты для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с авторизациями ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

### Π Π°Π±ΠΎΡ‚Π° с постами

Основой Π±Π»ΠΎΠ³Π° ΡΠ²Π»ΡΡŽΡ‚ΡΡ посты ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. Они ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π²Ρ‹Π²Π΅Π΄Π΅Π½Ρ‹ Π½Π° Π³Π»Π°Π²Π½ΠΎΠΉ страницС, Ρ‚Π°ΠΊ ΠΆΠ΅ доступна пагинация.
ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ изобраТСния ΠΊ постам, Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свои посты ΠΈ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡ΡƒΠΆΠΈΠ΅ ΠΈ свои посты.
Π’Π°ΠΊ ΠΆΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡƒΠ΄Π΅Π»Π΅Π½ΠΎ бСзопасности ΠΈ Π² частности XSS-Π°Ρ‚Π°ΠΊΠ°ΠΌ.
Валидация содСрТимого поста происходит ΠΊΠ°ΠΊ Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅ (посрСдством Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ JS ΠΈ HTML5-Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ), Ρ‚Π°ΠΊ ΠΈ Π½Π° сСрвСрС Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ [Post](src/Models/Post.php), ошибки Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ.

### Π Π°Π±ΠΎΡ‚Π° с коммСнтариями

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΏΠΎΠ΄ своими ΠΈ Ρ‡ΡƒΠΆΠΈΠΌΠΈ постами. Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с коммСнтариями создана модСль [Comment](src/Models/Comment.php) ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ [Comments](src/Controllers/Comments.php).
Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΈ анонимная ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π², Π½ΠΎ для этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Ρ‡Π΅Ρ€Π΅Π· Π²Π²ΠΎΠ΄ CAPTCHA.
ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ доступны Π² Π΅Π³ΠΎ ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅.
ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Ρ‚Π°ΠΊ ΠΆΠ΅ Π²Π°Π»ΠΈΠ΄ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ΡΡ Π½Π° XSS.

### Π₯ΡΡˆΡ‚Π΅Π³ΠΈ

Как ΠΈ любой соврСмСнный Π±Π»ΠΎΠ³ MyPosts ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ…ΡΡˆΡ‚Π΅Π³ΠΈ. Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ поста ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ парсится Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Ρ…ΡΡˆΡ‚Π΅Π³ΠΎΠ².
Π›ΠΎΠ³ΠΈΠΊΠ° ΠΏΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с Ρ…ΡΡˆΡ‚Π΅Π³Π°ΠΌΠΈ находится Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ [Hashtag](src/Controllers/Hashtag.php).
ПослСдниС 10 Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… Ρ…ΡΡˆΡ‚Π΅Π³ΠΎΠ² доступны Π½Π° Π³Π»Π°Π²Π½ΠΎΠΉ страницС. ΠŸΡ€ΠΈ ΠΊΠ»ΠΈΠΊΠ΅ ΠΏΠΎ Ρ…ΡΡˆΡ‚Π΅Π³Ρƒ выводятся связанныС с Π½ΠΈΠΌ посты.

### Π₯Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ

Для хранСния ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ доступны Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°.
- Π₯Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π½Π° Π±Π°Π·Π΅ сСрвиса AWS S3. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ AWS SDK.
- Π₯Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ локально.

Для использования AWS S3 Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ввСсти Π΄Π°Π½Π½Ρ‹Π΅ своСго Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚Π° Π² Ρ„Π°ΠΉΠ»Π΅ [config.php](config/config.php) ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π² константу `AWS_STORING` Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `true`.
Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ классом [S3Helper](src/Service/S3Helper.php), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ SDK ΠΈ прСдоставляСт интСрфСйс для взаимодСйствия с ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹ΠΌ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ΠΌ.

Для локального хранСния Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ `AWS_STORING` Π² `false`. ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒΡΡ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ `public/upload/`.

ВсС изобраТСния ΠΏΠ΅Ρ€Π΅Π΄ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ Π½Π° сСрвСр Π²Π°Π»ΠΈΠ΄ΠΈΡ€ΡƒΡŽΡ‚ΡΡ.

### Π¨Π°Π±Π»ΠΎΠ½Ρ‹

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ посрСдством ΡˆΠ°Π±Π»ΠΎΠ½ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° [Twig](https://twig.symfony.com/), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ наслСдованиС шаблонов.
Π¨Π°Π±Π»ΠΎΠ½Ρ‹ находятся Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ `src/Views`, Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ шаблон - [base.html.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](config/config.php)) Ρ€Π°Π²Π½ΠΎΠΉ `true`, Π² случаС ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈΠ»ΠΈ ошибки Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½Π° полная дСтализация.
Если `SHOW_ERRORS` присвоСно Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ `false` Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ лишь ΠΎΠ±Ρ‰Π΅Π΅ сообщСниС ΠΈΠ· шаблонов [404.html.twig](src/Views/404.html.twig) ΠΈΠ»ΠΈ [500.html.twig](src/Views/500.html.twig) Π² зависимости ΠΎΡ‚ ошибки.
ДСтализированная информация Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Π±ΡƒΠ΄Π΅Ρ‚ Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ `logs/`.