Ожидаемый отказ не равен дефекту
Неверное поле, запрет доступа и конфликт версии являются ожидаемыми исходами сценария. Потеря соединения, нарушенный инвариант и TypeError указывают на инфраструктуру или дефект. Граница приложения преобразует классы отказов в HTTP-ответы и решает уровень журнала.
Не ловите Throwable вокруг каждой строки. Локальный catch нужен, когда код действительно добавляет контекст, выполняет компенсацию или переводит низкоуровневую ошибку в предметный тип.
Два направления ошибки
Структурное событие
Лог содержит event name, severity, timestamp, build id, correlation id и минимальные идентификаторы. Поле password, session id, CSRF token и содержимое Authorization удаляются до передачи logger.
Не собирайте предложение конкатенацией, если затем нужно искать по user_id и duration_ms. Структура делает агрегацию возможной, но не оправдывает запись персональных данных без цели и срока хранения.
Часы как зависимость
Вызов new DateTimeImmutable('now') внутри модели делает тест зависимым от текущей секунды. Интерфейс Clock из PSR-20 или собственный узкий контракт позволяет production использовать системное время, а тесту — фиксированное.
Передавайте временную точку один раз в сценарий. Несколько вызовов now способны пересечь границу дня и создать запись с несогласованными датами. База и PHP также должны договориться об UTC.
Не логируйте дважды
Нижний слой либо оборачивает исключение с причиной, либо даёт ему подняться. Финальная граница записывает событие один раз. Лог на каждом уровне создаёт три записи одной ошибки и искажает метрику.
Stack trace полезен оператору, но не пользователю. В production response содержит стабильный код и correlation id, а подробности защищены политикой доступа и сроком хранения.
Лабораторная работа
Опишите InvalidWorkout, AccessDenied, VersionConflict и StorageUnavailable. Сопоставьте их HTTP-статусам, уровням PSR-3 и метрикам; затем протестируйте публикацию с фиксированными часами.
Закрепите материал
Отметка, заметка, чек-лист и ответы остаются в localStorage этого браузера и не отправляются в аналитику.
Перелинковка со справочником
Проверка актуальности
- php-fig.orghttps://www.php-fig.org/psr/psr-3/Первичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
- php-fig.orghttps://www.php-fig.org/psr/psr-20/Первичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
- cheatsheetseries.owasp.orghttps://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.htmlПервичный источник для актуализации фактов. Адрес приведён как текст и не является активной ссылкой.
Текст и схемы созданы для этого самоучителя без воспроизведения страниц, иллюстраций и листингов приложенной книги. Проверено: .