Файл BaseRepository.php в Cotonti

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

Основные элементы и функции файла:

  1. Используемые компоненты:

    • Cot: Это глобальный объект фреймворка, который предоставляет доступ к основным функциональностям, включая взаимодействие с базой данных.
    • GetInstanceTrait: Трейт, который позволяет использовать паттерн синглтон для получения экземпляра объекта класса. Это полезно для обеспечения единственности экземпляра репозитория.
  2. Переменные и константы:

    • $tableName: Переменная, которая хранит имя таблицы, с которой работает репозиторий. Это значение будет конкретизироваться в дочерних классах, которые будут использовать BaseRepository.
  3. Основные методы:

    • getByCondition: Основной метод, который выполняет SQL-запрос для получения данных из базы на основе переданных условий ($condition), сортировки ($orderBy) и других параметров. Этот метод возвращает данные в виде массива ассоциативных массивов, каждый из которых представляет запись в таблице.
    • prepareCondition: Этот метод помогает подготовить строку SQL-условия на основе массива условий, обеспечивая безопасное и корректное построение SQL-запросов.
    • castAttributes: Метод, который может использоваться для приведения типов данных, полученных из базы. В текущей реализации он не делает ничего, но в будущем может быть расширен для приведения строковых значений к нужным типам (например, даты или числа).

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

  • Репозиторий предоставляет абстракцию для работы с базой данных. Он получает данные по заданным условиям с возможностью сортировки и параметризации запросов.
  • Важным аспектом является то, что код написан таким образом, что может быть легко расширен для более специфичных операций с данными (например, для выполнения объединений таблиц — joins, для индексации результатов и так далее).
  • Он может быть использован в качестве базового класса для более специфичных репозиториев, которые обрабатывают данные определённых сущностей в системе.
  • Строки SQL-запросов и условия подготовки запросов вынесены в отдельные методы, что облегчает модификацию запросов, их тестирование и предотвращение SQL-инъекций.

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

  • BaseRepository служит базовым классом для работы с базой данных в контексте бизнес-логики приложения. Он применяется в различных частях системы, где требуется извлечение данных по условиям из базы данных.
  • Этот класс является частью слоя данных (Data Layer) приложения, который отвечает за доступ к данным и выполнение запросов к базе данных.

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

находится по адресу:/system/repositories/BaseRepository.php движка php-фреймворка

 

<?php

declare(strict_types=1); // Включение строгой типизации

namespace cot\repositories; // Пространство имен для репозиториев

use Cot; // Подключение класса Cot (основной класс фреймворка)
use cot\traits\GetInstanceTrait; // Подключение трейта для получения экземпляра

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

    protected $tableName = null; // Защищенная переменная для хранения имени таблицы (по умолчанию null)

    /**
     * @param array|string $condition Условие для выборки данных
     * @param array|string $orderBy Условие сортировки
     * @return array<int, array<int|string>> Данные запрашиваемых элементов
     * @todo joins, index by - это место для доработки (джойны, индексация)
     */
    public function getByCondition($condition, array $params = [], $orderBy = null): array // Метод для получения данных по условию
    {
        $table = Cot::$db->quoteTableName($this->tableName); // Экранируем имя таблицы для безопасности

        $sqlWhere = is_array($condition) ? $this->prepareCondition($condition) : $condition; // Проверяем, является ли условие массивом, и если да, подготавливаем его
        if (!empty($sqlWhere)) { // Если условие не пустое
            $sqlWhere = ' WHERE ' . $sqlWhere; // Добавляем условие WHERE к SQL запросу
        }

        $sqlOrderBy = ''; // Переменная для сортировки
        if (!empty($orderBy)) { // Если задано условие сортировки
            $sqlOrderBy = ' ORDER BY ' . (is_array($orderBy) ? implode(', ', $orderBy) : $orderBy); // Добавляем сортировку к SQL запросу
        }

        $sql = "SELECT {$table}.* " // Основной SQL запрос: выбираем все столбцы из таблицы
            . " FROM {$table} " // Указываем таблицу
            . $sqlWhere . $sqlOrderBy; // Добавляем условия WHERE и ORDER BY

        $items = Cot::$db->query($sql, $params)->fetchAll(); // Выполняем запрос и получаем все результаты
        if (empty($items)) { // Если данные не найдены
            return []; // Возвращаем пустой массив
        }

        $result = []; // Инициализируем пустой массив для результатов
        foreach ($items as $item) { // Проходим по каждому элементу
            $item = $this->castAttributes($item); // Приводим элементы к нужному типу
            $result[] = $item; // Добавляем элемент в результат
        }

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

    protected function prepareCondition(array $condition): string // Метод для подготовки условия запроса
    {
        return Cot::$db->prepareCondition($condition); // Используем метод prepareCondition из базы данных для подготовки условия
    }

    /**
     * В версиях PHP до 8 все поля возвращаются как строки
     * Поэтому может потребоваться привести некоторые атрибуты к нужному типу
     */
    protected function castAttributes(array $item): array // Метод для приведения типов атрибутов
    {
        return $item; // В текущей реализации типы не приводятся, просто возвращаем элементы без изменений
    }
}

 

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

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

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

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

Administrator

Оффлайн

Administrator

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

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