Проект реализует REST API для управления новостями, видеопостами и древовидными комментариями. Решение предназначено для демонстрации работы с полиморфными связями Laravel, курсорной пагинацией и CRUD-операциями для вложенных комментариев.
- CRUD для сущностей «Новость» и «Видео пост».
- Добавление, просмотр, редактирование и удаление комментариев к контенту.
- Ответы на комментарии любой глубины с сохранением иерархии.
- Курсорная пагинация комментариев при чтении новости или видеопоста.
- Ресурсные классы (
NewsResource,VideoPostResource,CommentResource) для единообразного формата ответов.
- PHP ^8.2
- Laravel ^12.0
- MySQL 8+ или SQLite (по умолчанию в локальной среде)
- Composer, npm, Vite (для сборки фронта при необходимости)
| Сущность | Основные поля | Особенности |
|---|---|---|
news |
title, description |
Полиморфная связь с комментариями |
video_posts |
title, description |
Полиморфная связь с комментариями |
comments |
body, user_id, commentable_*, parent_id |
Поддержка вложенности, отношение к пользователю |
users |
name, email, password |
Используются для авторства комментариев |
Модель Comment использует полиморфную связь commentable для привязки к новости или видеопосту и рекурсивные связи parent/children для вложенных ответов.
- PHP ^8.2 с расширениями
pdo,mbstring,openssl,curl,json. - Composer ^2.6
- Node.js ^18 и npm (для запуска фронтенд-скриптов, если потребуется).
- MySQL 8+ или SQLite. В репозитории подготовлена база
database/database.sqliteдля быстрого старта.
- Установите зависимости PHP:
composer install
- Создайте файл окружения (если отсутствует):
cp .env.example .env
- Настройте подключение к БД в
.env. Для SQLite достаточно раскомментироватьDB_CONNECTION=sqliteи убедиться, что файлdatabase/database.sqliteсуществует. Для MySQL заполнитеDB_HOST,DB_PORT,DB_DATABASE,DB_USERNAME,DB_PASSWORD. - Сгенерируйте ключ приложения:
php artisan key:generate
- Выполните миграции (и при необходимости сидеры):
php artisan migrate php artisan db:seed
- (Опционально) Установите фронтенд-зависимости и соберите ассеты:
npm install npm run build # или npm run dev - Запустите сервер разработки:
php artisan serve
API будет доступно по адресу http://127.0.0.1:8000/api.
Для удобства предусмотрен скрипт быстрого запуска:
composer run setupВсе маршруты расположены в routes/api.php и защищены префиксом /api.
GET /api/news— список новостей с пагинацией и поиском поtitleчерез?search=....POST /api/news— создание новости.GET /api/news/{id}— получение новости и её комментариев (курсорная пагинация).PUT/PATCH /api/news/{id}— обновление.DELETE /api/news/{id}— удаление.POST /api/news/{id}/comments— добавление комментария к новости.
Пример ответа GET /api/news/{id}:
{
"data": {
"id": 1,
"title": "Новость",
"description": "Описание",
"created_at": "2025-01-13T12:00:00+00:00",
"updated_at": "2025-01-13T12:00:00+00:00"
},
"comments": {
"data": [/* массив CommentResource */],
"meta": {
"next_cursor": null,
"prev_cursor": null,
"per_page": 10,
"path": "http://127.0.0.1:8000/api/news/1"
}
}
}GET /api/video-postsPOST /api/video-postsGET /api/video-posts/{id}PUT/PATCH /api/video-posts/{id}DELETE /api/video-posts/{id}POST /api/video-posts/{id}/comments
Ответы идентичны структуре новостей, но используют VideoPostResource.
GET /api/comments/{id}— получить комментарий с поддеревом.POST /api/comments/{id}/replies— создать ответ на комментарий.PUT/PATCH /api/comments/{id}— обновить тело комментария.DELETE /api/comments/{id}— удалить комментарий (каскад удаления потомков обеспечивается БД).
{
"body": "Текст комментария",
"user_id": 1
}php artisan testДля очистки конфигурации и кэша перед прогоном тестов используется сценарий composer test.
| Команда | Назначение |
|---|---|
php artisan migrate:fresh --seed |
Полностью пересоздать базу данных |
php artisan queue:listen |
Запуск воркера очередей (если потребуется в будущем) |
composer run dev |
Параллельный запуск сервера, очереди, логов и Vite |