Поднятие окружения. Типовой минимальный проект: PHP, HTTP, Composer и работы с базами данных
Работа выполняется с ИИ и(или) ИИ-агентом. Важно разобрать проект и понять что происходит. В данной ЛР важно понимать как поднимать окружение, какие технологии используются и для чего. Понимание глубокое элементов PHP не требуется.
Лабораторная работа 1. PHP, HTTP, Composer, ООП и архитектура простого веб-приложения
Цель: создать первое серверное веб-приложение без использования фреймворка.
Рабочий каталог:
plain-php/
PHP-приложение должно использовать Composer и автозагрузку классов. Composer является стандартным менеджером зависимостей PHP и предоставляет механизм автозагрузки классов. [6]
Задание
-
Создайте каталог проекта:
mkdir plain-php
cd plain-php
composer init
-
Настройте в composer.json:
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}
-
Выполните:
composer dump-autoload
-
Создайте структуру:
plain-php/
├── composer.json
├── public/
│ └── index.php
├── src/
│ ├── Http/
│ ├── Controller/
│ ├── Domain/
│ └── Service/
└── tests/
-
Реализуйте единый front controller:
public/index.php
-
Реализуйте маршруты:
GET /
GET /health
GET /about
GET /quote
-
Маршрут /health должен возвращать JSON:
{
"status": "ok",
"php": "...",
"timestamp": "..."
}
-
Маршрут /quote принимает:
qty
price
discount
Пример:
/quote?qty=10&price=1250&discount=7
-
Создайте классы:
App\Domain\Money
App\Domain\Quote
App\Service\QuoteCalculator
App\Http\Request
App\Http\Response
App\Controller\QuoteController
-
Используйте:
declare(strict_types=1);
-
Используйте:
-
namespaces;
-
типы аргументов;
-
типы возвращаемых значений;
-
readonly-свойства там, где это оправданно;
-
исключения для некорректных данных;
-
DateTimeImmutable.
-
Цена внутри бизнес-логики должна храниться целым количеством копеек.
-
Реализуйте правила:
quantity > 0
price > 0
0 <= discount <= 50
-
Рассчитайте:
subtotal = quantity × price
discountAmount = subtotal × discount / 100
total = subtotal - discountAmount
-
Создайте HTML-представление расчета.
-
Экранируйте пользовательские данные перед включением в HTML.
-
Добавьте обработку:
400 Bad Request
404 Not Found
500 Internal Server Error
-
Запустите приложение:
php -S localhost:8000 -t public
-
Проверьте HTTP-запросы:
curl -i http://localhost:8000/health
curl -i "http://localhost:8000/quote?qty=10&price=1250&discount=7"
curl -i "http://localhost:8000/quote?qty=-1&price=1250&discount=7"
curl -i http://localhost:8000/unknown
-
Установите PHPUnit как dev-зависимость.
-
Напишите тесты класса QuoteCalculator.
-
Обязательно проверить:
обычный расчет;
скидка 0%;
скидка 50%;
quantity = 0;
отрицательная цена;
discount > 50.
Обязательный запрос ИИ-аналитику
Ты — архитектор PHP-приложений.
Мне необходимо реализовать учебное PHP 8.4+ приложение без фреймворка,
использующее Composer, PSR-4, ООП и front controller.
Функции:
GET /
GET /health
GET /about
GET /quote?qty=&price=&discount=
Предложи минимальную архитектуру каталогов и классов.
Контроллер не должен содержать бизнес-логику.
Бизнес-логика расчета стоимости должна тестироваться отдельно.
Сначала дай архитектуру и последовательность реализации.
Код пока не пиши.
Обязательный запрос ИИ-тестировщику
Проанализируй QuoteCalculator.
Создай набор unit-тестов, включающий:
обычные случаи;
граничные значения;
ошибочные значения;
проверку округления денежных значений.
После создания тестов запусти их.
Если тесты падают, найди причину и предложи исправление production-кода.
Не изменяй ожидаемый результат теста только ради получения зеленого теста.
Результат работы
plain-php/
docs/ai/lab-01.md
Создать Git-тег:
git tag lab-01
Критерии приемки
[ ] приложение запускается
[ ] Composer autoload работает
[ ] используются namespaces
[ ] реализовано ООП
[ ] /health возвращает JSON
[ ] /quote выполняет расчет
[ ] ошибочные входные данные отклоняются
[ ] 404 реализован
[ ] PHPUnit-тесты проходят
[ ] имеется AI log
[ ] отсутствуют секреты
PHP предназначен в том числе для серверной веб-разработки; актуальные ветки PHP 8 поддерживают современные механизмы типизации и объектной модели, а Composer предоставляет механизм управления зависимостями и автозагрузки. [7]
