Файл ErrorHandler.php в Cotonti

назначение класса ErrorHandler в файле ErrorHandler.php заключается в обработке исключений и ошибок, возникающих в приложении, и в управлении тем, как эти ошибки отображаются пользователю.

Основное назначение класса ErrorHandler в файле ErrorHandler.php заключается в обработке исключений и ошибок, возникающих в приложении, и в управлении тем, как эти ошибки отображаются пользователю. Класс централизованно решает, нужно ли логировать исключения, блокировать доступ при определённых ошибках (например, при ForbiddenHttpException), а также решает, какие сообщения об ошибках следует выводить в зависимости от настроек конфигурации и группы пользователя.

Суть содержания кода:

  1. Обработка исключений: Класс обрабатывает различные типы исключений, такие как ForbiddenHttpException, NotFoundHttpException, BadRequestHttpException, и HttpException. Он проверяет тип исключения и в зависимости от этого решает, нужно ли его логировать, блокировать ли доступ или показывать подробное сообщение об ошибке.

  2. Логирование исключений: Если исключение не относится к критическим (например, 403, 404 или 400 ошибки), оно логируется в системный журнал с помощью функции error_log().

  3. Отображение сообщений об ошибке: Для HttpException и других ошибок, отображение сообщений пользователю зависит от конфигурации (если разрешено показывать ошибки) и группы пользователя. Для администраторов (например, супер-администраторов) показываются подробные сообщения об ошибках, включая трассировку стека.

  4. Завершение работы приложения: В случае ошибки выполнение скрипта завершается с помощью функции cot_die_message(), которая выводит сообщение и завершает выполнение.

Характеристика стиля PHP:

  1. Объектно-ориентированное программирование (ООП): В коде используется объектно-ориентированный стиль программирования, где создается класс ErrorHandler с методами для обработки исключений и отображения ошибок. В классе применяется наследование и использование трейтов (например, GetInstanceTrait).

  2. Использование строгой типизации: Включена строгая типизация с помощью директивы declare(strict_types=1), что требует точного соответствия типов данных.

  3. Использование пространства имен (namespace): Применяется пространство имен cot, что помогает организовать код и избегать конфликтов имен.

  4. Обработка исключений с использованием интерфейса Throwable: Весь код ориентирован на работу с исключениями и ошибками через интерфейс Throwable, что позволяет обработать как ошибки, так и исключения в единой структуре.

  5. Глобальные переменные: В некоторых местах кода используются глобальные переменные $cfg и $usr, что может быть недостатком с точки зрения чистоты кода, но это обычная практика в некоторых системах, чтобы избежать передачи этих значений через множество функций.

  6. Читаемость и комментарии: Код достаточно читаемый, с четкими именами переменных и методов, которые ясно отражают их назначение. В комментариях поясняется логика работы функций и их применения.

В целом, стиль кода можно охарактеризовать как современный и объектно-ориентированный, с акцентом на чистоту и четкость обработки ошибок, при этом с использованием глобальных переменных для работы с конфигурацией и пользователями.

 

declare(strict_types=1); // Включает строгую типизацию, что означает, что типы переменных должны строго соответствовать объявленным типам

namespace cot; // Определение пространства имен "cot" для всех классов и функций, относящихся к этому проекту

use cot\exceptions\BadRequestHttpException; // Подключение класса исключения для ошибок типа "Неверный запрос" (HTTP 400)
use cot\exceptions\ForbiddenHttpException; // Подключение класса исключения для ошибок типа "Запрещено" (HTTP 403)
use cot\exceptions\HttpException; // Подключение базового класса исключений для HTTP ошибок
use cot\exceptions\NotFoundHttpException; // Подключение класса исключения для ошибок типа "Не найдено" (HTTP 404)
use cot\traits\GetInstanceTrait; // Подключение трейта для реализации паттерна "Одиночка" (Singleton)
use Throwable; // Подключение интерфейса Throwable для работы с исключениями и ошибками

defined('COT_CODE') or die('Wrong URL'); // Проверка, что константа COT_CODE определена. Если нет, выполнение скрипта остановится с ошибкой "Неверный URL"

// Определение класса ErrorHandler для обработки ошибок в системе
class ErrorHandler
{
    use GetInstanceTrait; // Использование трейта GetInstanceTrait для предоставления метода получения экземпляра класса (Одиночка)

    // Метод обработки исключений
    public function handle(Throwable $exception): bool
    {
        // В этом блоке класса cot еще может не быть инициализирован, поэтому используется глобальные переменные
        global $cfg, $usr;

        $logException = true; // Переменная для определения, нужно ли логировать исключение

        // Проверка типа исключения. Если это ошибки 403, 404 или 400, то исключение не будет логироваться.
        if (
            $exception instanceof ForbiddenHttpException // Если исключение типа "ForbiddenHttpException"
            || $exception instanceof NotFoundHttpException // Или исключение типа "NotFoundHttpException"
            || $exception instanceof BadRequestHttpException // Или исключение типа "BadRequestHttpException"
        ) {
            $logException = false; // Исключение не логируется
        }

        // Если нужно логировать исключение
        if ($logException) {
            error_log((string) $exception); // Логирование исключения в системный журнал
        }

        // Если исключение типа ForbiddenHttpException, блокируем доступ
        if ($exception instanceof ForbiddenHttpException) {
            cot_block(false); // Блокировка доступа пользователю
        }

        // Если исключение типа HttpException
        if ($exception instanceof HttpException) {
            // Проверка, нужно ли отображать ошибки в зависимости от конфигурации и группы пользователя
            $displayErrors = $cfg['display_errors'] || in_array(COT_GROUP_SUPERADMINS, $usr['groups']);

            // Завершаем выполнение скрипта с сообщением об ошибке
            cot_die_message(
                $exception->getCode(), // Код ошибки, полученный из исключения
                true, // Указывает, что сообщение будет выводиться
                '', // Пустое сообщение (можно добавить дополнительные данные, если нужно)
                $displayErrors ? $exception->getMessage() : '' // Сообщение исключения, если отображение ошибок разрешено
            );
        }

        $this->displayError($exception); // Вызов метода для отображения ошибки

        return true; // Возвращаем true, подтверждая обработку исключения
    }

    /**
     * Отображает исключение пользователю и завершает выполнение скрипта
     */
    public function displayError(Throwable $exception): void
    {
        // В этом блоке класса cot еще может не быть инициализирован, поэтому используются глобальные переменные
        global $cfg, $usr;

        // Проверка, нужно ли отображать ошибки в зависимости от конфигурации и группы пользователя
        $displayErrors = $cfg['display_errors'] || in_array(COT_GROUP_SUPERADMINS, $usr['groups']);

        // Если ошибки нужно отображать
        if ($displayErrors) {
            // Получение основного названия сайта или URL
            $mainTitle = $cfg['maintitle'] ?? $cfg['mainurl']; // Если название сайта не задано, используем URL сайта
            $message_body = '<p><em>' . @date('Y-m-d H:i') . '</em></p>'; // Формируем строку с текущей датой и временем
            // Формирование сообщения с деталями исключения (сообщение, файл и строка)
            $message_body .= '<p>' . $exception->getMessage() . ' in ' . $exception->getFile() . ':' 
                . $exception->getLine() . '</p>';
            $message_body .= '<pre style="overflow: auto">' . $exception->getTraceAsString() . '</pre>'; // Вывод трассировки стека
            $message_body .= '<hr /><a href="' . $cfg['mainurl'] . '">' . $mainTitle . '</a>'; // Ссылка на главную страницу

            // Завершаем выполнение скрипта с деталями ошибки
            cot_die_message(500, true, '', $message_body);
        } else {
            // Если ошибки не нужно отображать, выводим сообщение о технических проблемах
            cot_die_message(503, true);
        }
    }
}

Разбор:

  1. В классе используется строгая типизация, что означает, что все параметры и возвращаемые значения функций строго проверяются на соответствие типам.
  2. Основное назначение класса ErrorHandler — это обработка ошибок и исключений в приложении.
  3. В классе реализованы два метода:
    • handle() — Обрабатывает исключения, проверяя их типы и принимая решение о логировании и отображении ошибок.
    • displayError() — Отображает информацию о возникшей ошибке пользователю в зависимости от конфигурации отображения ошибок.

Это помогает централизованно управлять обработкой ошибок и исключений, а также контролировать отображение и логирование ошибок в зависимости от настроек и группы пользователя.

 

 

5 минут чтения Administrator

Комментарии (0)

Комментарии отсутствуют
Добавление комментариев доступно только зарегистрированным пользователям

Автор контента

Administrator

Оффлайн

Administrator

Последняя авторизация: 05.07.2026 18:32

  • Страница размещена: 26.01.2025 13:10
  • Последнее обновление: 26.01.2025 13:10