Файл 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 minutes read Administrator

Comments (0)

No comments yet
Only registered users can post new comments

Article multicategories

Additional categories where this article is shown as similar.

Content author

Administrator

Offline

Administrator

Last logged: 2026-09-13 14:50

  • Page published: 2025-01-28 00:01
  • Last update: 2025-01-28 00:01