Файл UsersRepository.php в Cotonti

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

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

  • Класс UsersRepository является репозиторием для работы с данными пользователей, наследуя базовый класс BaseRepository, что предполагает наличие общих методов для работы с таблицами базы данных.
  • В классе используется кэширование на основе статического свойства cacheById для хранения данных о пользователях, чтобы повторно не запрашивать информацию из базы данных.
  • Метод getById позволяет получить информацию о пользователе по его ID, с возможностью использования кэширования для повышения производительности.
  • Метод castAttributes используется для приведения данных из базы данных к нужным типам данных (например, преобразование временных меток в целые числа).

Список классов:

  • UsersRepository — основной класс репозитория пользователей.

Список методов и функций:

  1. __construct() — Конструктор, который задает имя таблицы для работы с пользователями.
  2. getById(?int $id, bool $useCache = true): ?array — Получает данные о пользователе по его ID. Использует кэш, если это разрешено.
  3. castAttributes(array $item): array — Приводит атрибуты данных пользователя к нужным типам (например, целые числа).

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

  • Строгая типизация: В файле используется строгая типизация с директивой declare(strict_types=1), что означает, что типы данных аргументов и возвращаемых значений строго проверяются.
  • Использование пространства имен: Применяется пространство имен cot\users, что помогает избежать конфликтов имен классов в более крупных приложениях.
  • Использование PHP-типов: Для переменных и возвращаемых значений используются типы данных, такие как ?int (для допуска значения null), array и bool.
  • Реализация кэширования: В коде реализовано кэширование с использованием статического свойства cacheById, что помогает избежать избыточных запросов к базе данных.
  • Наследование от базового класса: Класс UsersRepository наследует от BaseRepository, что позволяет использовать общую логику для работы с базой данных, упрощая повторное использование кода.

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

файл UsersRepository.php в Cotonti CMF, который находится по адресу: system/users/UsersRepository.php

 

<?php

declare(strict_types=1); // Объявляется строгая типизация

namespace cot\users; // Указываем, что класс принадлежит пространству имен cot\users

use Cot; // Подключаем класс Cot
use cot\repositories\BaseRepository; // Подключаем базовый репозиторий для работы с данными

defined('COT_CODE') or die('Wrong URL'); // Проверка, что файл был вызван корректно, иначе выводим ошибку

/**
 * Users repository
 * @package Cotonti
 * @copyright (c) Cotonti Team
 * @license https://github.com/Cotonti/Cotonti/blob/master/License.txt
 */
class UsersRepository extends BaseRepository // Объявляем класс UsersRepository, который наследует BaseRepository
{
    private static $cacheById = []; // Статическое свойство для кэширования пользователей по их ID

    public function __construct() // Конструктор класса
    {
        $this->tableName = Cot::$db->users; // Устанавливаем имя таблицы из глобальной базы данных
    }

    /**
     * Fetches user entry from DB
     * @param ?int $id User ID
     * @param bool $useCache Use one time session cache
     * @return ?array
     */
    public function getById(?int $id, bool $useCache = true): ?array // Метод для получения пользователя по ID
    {
        if ($id === null && Cot::$usr['id'] > 0) { // Если ID не передан и текущий пользователь авторизован
            $id = Cot::$usr['id']; // Используем ID текущего пользователя
        }
        if (empty($id) || $id < 1) { // Если ID пустое или меньше 1
            return null; // Возвращаем null
        }

        if ($useCache && isset(self::$cacheById[$id])) { // Если используем кэш и есть данные для данного ID
            return self::$cacheById[$id] !== false ? self::$cacheById[$id] : null; // Возвращаем данные из кэша, если они не ложные
        }

        if ($id === Cot::$usr['id'] && $useCache) { // Если ID текущего пользователя и мы используем кэш
            $result = Cot::$usr['profile']; // Используем профиль текущего пользователя
        } else { 
            $condition = 'user_id = :userId'; // Условие для выборки данных пользователя
            $params = ['userId' => $id]; // Параметры запроса

            $results = $this->getByCondition($condition, $params); // Получаем результаты из базы данных
            $result = !empty($results) ? $results[0] : null; // Если результаты есть, возвращаем первый, иначе null
        }

        self::$cacheById[$id] = !empty($result) ? $result : false; // Кэшируем результат для дальнейшего использования

        return $result; // Возвращаем результат
    }

    protected function castAttributes(array $item): array // Метод для приведения атрибутов к нужным типам
    {
        $item['user_id'] = (int) $item['user_id']; // Приводим ID пользователя к целому числу
        $item['user_maingrp'] = (int) $item['user_maingrp']; // Приводим ID главной группы пользователя к целому числу
        $item['user_banexpire'] = (int) $item['user_banexpire']; // Приводим время окончания бана к целому числу
        $item['user_regdate'] = (int) $item['user_regdate']; // Приводим дату регистрации пользователя к целому числу
        $item['user_lastlog'] = (int) $item['user_lastlog']; // Приводим время последнего логина к целому числу
        $item['user_lastvisit'] = (int) $item['user_lastvisit']; // Приводим время последнего визита к целому числу
        $item['user_logcount'] = (int) $item['user_logcount']; // Приводим количество логинов к целому числу
        $item['user_sidtime'] = (int) $item['user_sidtime']; // Приводим время сессии пользователя к целому числу

        return $item; // Возвращаем измененный массив
    }
}

 

Объяснение кода:

  1. Конструктор устанавливает имя таблицы для репозитория пользователей.
  2. Метод getById получает информацию о пользователе по ID. Он использует кэш, если это разрешено, и, если данных нет, запрашивает их из базы данных. Также обрабатывается ситуация с текущим авторизованным пользователем.
  3. Метод castAttributes используется для приведения данных пользователя к правильным типам данных (например, к целым числам для определённых полей).

Класс использует кэширование, чтобы ускорить повторные запросы данных для пользователей, избегая лишних запросов к базе данных.

 

5 minutes read Administrator

Comments (0)

No comments yet
Only registered users can post new comments

Content author

Administrator

Offline

Administrator

Last logged: 2026-07-05 18:32

  • Page published: 2025-01-27 23:30
  • Last update: 2025-01-27 23:30