Перейти к содержанию

(PHP) 1.2 Уровни ошибок — класс LogLevelsClass

Уровни ошибок

В прошлой статье была представлена полная структура обработчика ошибок. В этой статье мы рассмотрим класс «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». Кроме того тип данных, возвращаемых методами класса указывается сразу после объявления метода:

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«.

Опубликовано в рубрике1. Ошибки и Исключения