Разработка на PHP: Как создать класс исключений (Exception) с поддержкой сообщения и уникального слага (slug) для логирования ошибок?
Создание собственного класса исключений в PHP с поддержкой уникального слага (slug) — распространённая практика в профессиональной разработке. Это позволяет структурировать логирование ошибок, быстро идентифицировать их тип и источник без разбора текстовых сообщений.
## Базовая структура класса исключения со слагом
В PHP все исключения наследуются от базового класса `Exception`. Чтобы добавить поддержку слага, достаточно расширить этот класс:
php
slug = $slug;
parent::__construct($message, $code, $previous);
}
public function getSlug(): string
{
return $this->slug;
}
public function __toString(): string
{
return «[{$this->slug}] {$this->getMessage()} (code: {$this->getCode()})»;
}
}
## Использование класса
php
try {
throw new SlugException(
‘Пользователь не найден в базе данных’,
‘user-not-found’,
404
);
} catch (SlugException $e) {
// Логирование с использованием слага
error_log(«[{$e->getSlug()}] » . $e->getMessage());
echo $e; // [user-not-found] Пользователь не найден (code: 404)
}
## Иерархия исключений для разных доменов
Рекомендуется создавать иерархию классов для разных типов ошибок:
php
class DatabaseException extends SlugException {}
class ValidationException extends SlugException {}
class AuthException extends SlugException {}
// Использование
throw new DatabaseException(‘Ошибка подключения’, ‘db-connection-failed’, 500);
throw new ValidationException(‘Поле email обязательно’, ‘validation-email-required’, 422);
## Автогенерация уникального слага
Для обеспечения уникальности можно добавить временную метку или UUID:
php
public static function create(string $message, string $baseSlug): self
{
$uniqueSlug = $baseSlug . ‘-‘ . uniqid();
return new self($message, $uniqueSlug);
}
## Интеграция с логгером (PSR-3)
При использовании PSR-3-совместимого логгера (например, Monolog) слаг удобно передавать в контекст:
php
} catch (SlugException $e) {
$logger->error($e->getMessage(), [
‘slug’ => $e->getSlug(),
‘code’ => $e->getCode(),
‘trace’ => $e->getTraceAsString(),
]);
}
## Лучшие практики
— **Именуйте слаги в kebab-case**: `user-not-found`, `payment-failed`.
— **Используйте префиксы домена**: `auth-token-expired`, `db-query-timeout`.
— **Не меняйте слаги** после публикации — на них могут опираться мониторинговые системы.
— **Документируйте слаги** в отдельном реестре ошибок проекта.
Такой подход значительно упрощает отладку, мониторинг и автоматическую классификацию ошибок в production-среде.
