Файл ServerEventsRepository.php в Cotonti
Основное назначение файла ServerEventsRepository.php в движке Cotonti CMF заключается в реализации репозитория для работы с событиями, связанными с наблюдателями на сервере. Этот файл содержит класс ServerEventsRepository, который взаимодействует с базой данных для получения, обработки и управления данными событий, связанными с конкретными пользователями и их активностью через токены.
Суть содержания кода:
-
Метод
getForObserver: Этот метод предназначен для получения событий для определённого пользователя (поuserId) и его токену (поtoken). В первую очередь, метод проверяет, существуют ли данные о текущем наблюдателе (пользователе с данным токеном). Если такие данные есть, он строит SQL-запрос, чтобы получить все события, произошедшие после последнего обновления наблюдателя. Запрос также проверяет, были ли уже отправлены события с ID, которые меньше или равны последнему событию, записанному в базе данных. -
Преобразование данных: Полученные данные о событиях из базы данных затем преобразуются в массив объектов
ServerEventMessageDto. Это позволяет работать с данными в виде объектов, что упрощает дальнейшее использование в системе. -
Работа с базой данных: Код эффективно использует запросы к базе данных с фильтрацией данных по различным условиям: времени обновления наблюдателя, последнему 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;
}
}
Основные моменты:
- Пространство имен: Определено для использования внутри системы.
- Метод
getForObserver: Этот метод получает события для конкретного пользователя и токена, проверяя, какие события были добавлены после последнего обновления наблюдателя. - Работа с базой данных: Используется SQL-запрос для выборки данных, после чего результаты преобразуются в объекты
ServerEventMessageDtoдля удобства работы с ними. - Возврат данных: Если нет событий или наблюдатель не найден, возвращается пустой массив. В противном случае возвращаются события, которые соответствуют условиям выборки.
Это класс репозитория для работы с событиями на сервере в рамках наблюдателей в движке Cotonti.
Comments (0)
Content author
Offline
Administrator
Last logged: 2026-08-03 13:51
- Page published: 2025-01-28 00:01
- Last update: 2025-01-28 00:01