Файл ServerEventsRepository.php в Cotonti

Основное назначение файла ServerEventsRepository.php в движке Cotonti CMF заключается в реализации репозитория для работы с событиями, связанными с наблюдателями на сервере. Этот файл содержит класс ServerEventsRepository, который взаимодействует с базой данных для получения, обработки и управления данными событий, связанными с конкретными пользователями и их активностью через токены.

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

  1. Метод getForObserver: Этот метод предназначен для получения событий для определённого пользователя (по userId) и его токену (по token). В первую очередь, метод проверяет, существуют ли данные о текущем наблюдателе (пользователе с данным токеном). Если такие данные есть, он строит SQL-запрос, чтобы получить все события, произошедшие после последнего обновления наблюдателя. Запрос также проверяет, были ли уже отправлены события с ID, которые меньше или равны последнему событию, записанному в базе данных.

  2. Преобразование данных: Полученные данные о событиях из базы данных затем преобразуются в массив объектов ServerEventMessageDto. Это позволяет работать с данными в виде объектов, что упрощает дальнейшее использование в системе.

  3. Работа с базой данных: Код эффективно использует запросы к базе данных с фильтрацией данных по различным условиям: времени обновления наблюдателя, последнему ID события и прочее.

Место в системе:

  • Репозиторий: Класс ServerEventsRepository является частью системы репозиториев, предназначенных для абстракции взаимодействия с данными (в данном случае с событиями). В архитектуре системы репозиторий отвечает за взаимодействие с базой данных, позволяя другим частям системы не заниматься деталями хранения и извлечения данных.

  • Наблюдатели и события: Функционал этого класса используется в контексте системы событий и наблюдателей, где наблюдатели (пользователи с определённым токеном) могут получать уведомления о событиях, происходящих на сервере. Репозиторий обеспечивает получение этих событий на основе состояния наблюдателя, фильтруя их по времени и ID события.

  • Управление состоянием событий: Этот класс является связующим звеном для того, чтобы система могла отслеживать события в реальном времени и отправлять их соответствующим наблюдателям.

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

 

/system/serverEvents/repositories/ServerEventsRepository.php

 

<?php

declare(strict_types=1); // Включение строгой типизации, все данные в функции должны быть в строгом соответствии с типами.
 
namespace cot\serverEvents\repositories; // Определение пространства имен для репозитория событий.

use Cot; // Подключение глобального объекта Cot для работы с базой данных.
use cot\serverEvents\ServerEventMessageDto; // Подключение DTO для событий, используемых в репозитории.
use cot\traits\GetInstanceTrait; // Использование трейта для реализации синглтона.

defined('COT_CODE') or die('Wrong URL'); // Защита от прямого доступа к файлу (проверка константы COT_CODE).

/**
 * Server Events repository
 * @package Cotonti
 * @copyright (c) Cotonti Team
 * @license https://github.com/Cotonti/Cotonti/blob/master/License.txt
 *
 * @todo use more fast adapters then MySQL. Redis? // TODO: Использовать более быстрые адаптеры, например Redis, вместо MySQL.
 */
class ServerEventsRepository
{
    use GetInstanceTrait; // Использование трейта с реализацией синглтона.

    /**
     * @return ServerEventMessageDto[] // Метод возвращает массив объектов ServerEventMessageDto.
     */
    public function getForObserver(int $userId, string $token): array
    {
        // Экранирование имен таблиц в базе данных для предотвращения SQL-инъекций.
        $table = Cot::$db->quoteTableName(Cot::$db->server_events);
        $observerTable = Cot::$db->quoteTableName(Cot::$db->server_events_observers);

        // Запрос для получения данных об обновлении и последнем событии для данного наблюдателя.
        $observer = Cot::$db->query(
            'SELECT updated_at, last_event_id FROM ' . $observerTable
            . ' WHERE user_id = :userId AND token = :token', // Условие для получения данных о наблюдателе.
            ['userId' => $userId, 'token' => $token] // Передача параметров запроса.
        )->fetch(); // Выполнение запроса и извлечение результата.

        // Если данные о наблюдателе отсутствуют, возвращаем пустой массив.
        if (empty($observer)) {
            return [];
        }

        // Формируем условие для выборки событий, которые были созданы после последнего обновления наблюдателя.
        $condition = "{$table}.user_id = :userId AND {$table}.created_at >= '{$observer['updated_at']}'";
        // Если существует last_event_id, добавляем условие для событий, ID которых больше этого значения.
        if ($observer['last_event_id'] > 0) {
            $condition .= " AND {$table}.id > {$observer['last_event_id']}";
        }

        // Запрос для получения всех событий, которые соответствуют условиям.
        $sql = 'SELECT * FROM ' . Cot::$db->server_events . " WHERE {$condition} ORDER BY {$table}.created_at ASC";
        $data = Cot::$db->query($sql, [':userId' => $userId]); // Выполнение запроса.

        // Если данные пустые, возвращаем пустой массив.
        if (empty($data)) {
            return [];
        }

        // Инициализация массива для хранения результатов.
        $result = [];
        // Перебор полученных данных и преобразование каждой строки в объект ServerEventMessageDto.
        foreach ($data as $row) {
            $result[] = ServerEventMessageDto::fromArray($row); // Преобразование и добавление в результат.
        }
        // Возвращаем массив с результатами.
        return $result;
    }
}

Основные моменты:

  1. Пространство имен: Определено для использования внутри системы.
  2. Метод getForObserver: Этот метод получает события для конкретного пользователя и токена, проверяя, какие события были добавлены после последнего обновления наблюдателя.
  3. Работа с базой данных: Используется SQL-запрос для выборки данных, после чего результаты преобразуются в объекты ServerEventMessageDto для удобства работы с ними.
  4. Возврат данных: Если нет событий или наблюдатель не найден, возвращается пустой массив. В противном случае возвращаются события, которые соответствуют условиям выборки.

Это класс репозитория для работы с событиями на сервере в рамках наблюдателей в движке Cotonti.

 

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

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

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

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

Administrator

Оффлайн

Administrator

Последняя авторизация: 03.08.2026 13:51

  • Страница размещена: 28.01.2025 00:01
  • Последнее обновление: 28.01.2025 00:01