
В прошлой статье была представлена полная структура обработчика ошибок. В этой статье мы рассмотрим класс «LogLevelsClass«. Это класс описывает уровни ошибок. Так как этот класс самостоятельный, то он располагается в директории «class» корневой папки компонента ядра «Log».

Сам класс определён в следующем пространстве имён:
namespace Hydra\Log\Levels;
Константы класса «LogLevelsClass». Уровни ошибок
В самом классе объявляется ряд констант, один массив и три метода. Объявляемые константы содержат в себе информацию о наименовании уровня и о его кодовом обозначении. Итак в классе указаны следующие уровни ошибок:
class LogLevelsClass { const EMERGENCY = 'EMERGENCY'; const ALERT = 'ALERT'; const CRITICAL = 'CRITICAL'; const ERROR = 'ERROR'; const WARNING = 'WARNING'; const NOTICE = 'NOTICE'; const INFO = 'INFO'; const DEBUG = 'DEBUG'; const EMERGENCY_CODE = 800; const ALERT_CODE = 700; const CRITICAL_CODE = 600; const ERROR_CODE = 500; const WARNING_CODE = 400; const NOTICE_CODE = 300; const INFO_CODE = 200; const DEBUG_CODE = 100; }
Уровень «EMERGENCY» — срочная тревога. Система управления сайтом не запускается.
Уровень «ALERT» — меры должны быть приняты немедленно. Например: не работает веб-сайт (проблемы с запуском необходимых компонентов системы управления сайтом) , база данных недоступна и т. д.
Уровень «CRITICAL» — критическая ошибка. Например: проблемы с запуском компонентов, сбой в работе которых не приведёт к прекращению функционирования CMS.
Уровень «ERROR» — ошибки, возникающие во время работы CMS. Они не требуют немедленных действий, но обычно должны регистрироваться и отслеживаться.
Уровень «WARNING» — исключительные случаи, которые не являются ошибками. Например: использование устаревших API.
Уровень «NOTICE» — необычные события.
Уровень «INFO» — интересные события. Пример: пользователь входит в систему.
Уровень «DEBUG» — информация об отладке
Каждый уровень ошибки может содержать до 100 вариантов. Например уровень ошибок с кодами «543» и «589» будет определен как «ERROR«.
Теперь добавим к классу массив $levels. Так как в процессе работы CMS в него не будут вноситься какие-либо изменения, то этот массив объявляется статическим:
protected static array $levels = [
self::EMERGENCY_CODE => self::EMERGENCY,
self::ALERT_CODE => self::ALERT,
self::CRITICAL_CODE => self::CRITICAL,
self::ERROR_CODE => self::ERROR,
self::WARNING_CODE => self::WARNING,
self::NOTICE_CODE => self::NOTICE,
self::INFO_CODE => self::INFO,
self::DEBUG_CODE => self::DEBUG
];
Прошу заметить, что я использую PHP версии 7.4, поэтому перед переменной $levels указан тип данных «array». Кроме того, при использовании данной версии PHP, тип данных, возвращаемых методами класса указывается сразу после объявления метода:
public function имя_метода(): тип возвращаемых данных { .......... }
Методы класса «LogLevelsClass»
Класс «LogLevelsClass» использует следующие методы:
public static function levels(): array
{
return self::$levels;
}
Метод «levels» — возвращает массив $levels.
public static function getLevel($code): string
{
$code = intval($code/100)*100;
if (isset(self::$levels[$code])) {
return self::$levels[$code];
}
return '';
}
Метод «getLevel» — анализирует код ошибки и возвращает имя уровня. Так как каждый уровень ошибок имеет около сотни вариантов, то определение кода уровня происходит именно таким образом.
public static function getCode($name): string
{
$flip = array_flip(self::$levels);
if (isset($flip[$name])) {
return $flip[$name];
}
return '';
}
Метод «getCode» — получает код уровня на основании его имени. В этом методе использована функция «array_flip()«. Она возвращает массив, в котором ключи становятся значениями, а значения массива ключами.
Окончательный вид класса
Вот так выглядит класса «LogLevelsClass«. Хоть он и является самостоятельным классом, его роль носит вспомогательный характер.
<?php namespace Hydra\Log\Levels; class LogLevelsClass { const EMERGENCY = 'EMERGENCY'; const ALERT = 'ALERT'; const CRITICAL = 'CRITICAL'; const ERROR = 'ERROR'; const WARNING = 'WARNING'; const NOTICE = 'NOTICE'; const INFO = 'INFO'; const DEBUG = 'DEBUG'; const EMERGENCY_CODE = 800; const ALERT_CODE = 700; const CRITICAL_CODE = 600; const ERROR_CODE = 500; const WARNING_CODE = 400; const NOTICE_CODE = 300; const INFO_CODE = 200; const DEBUG_CODE = 100; protected static array $levels = [ self::EMERGENCY_CODE => self::EMERGENCY, self::ALERT_CODE => self::ALERT, self::CRITICAL_CODE => self::CRITICAL, self::ERROR_CODE => self::ERROR, self::WARNING_CODE => self::WARNING, self::NOTICE_CODE => self::NOTICE, self::INFO_CODE => self::INFO, self::DEBUG_CODE => self::DEBUG ]; /** * @return string[] */ public static function levels(): array { return self::$levels; } /** * * @param $code * @return string */ public static function getLevel($code): string { $code = intval($code/100)*100; if (isset(self::$levels[$code])) { return self::$levels[$code]; } return ''; } /** * * @param $name * @return string */ public static function getCode($name): string { $flip = array_flip(self::$levels); if (isset($flip[$name])) { return $flip[$name]; } return ''; } }
Итак уровни ошибок определены. Каждый уровень можно подразделить на несколько подуровней, каждому из которых можно присвоить индивидуальный код. Теперь можно приступить к созданию класса «FormatAbstract«, который реализует интерфейс «FormatInterface«.