Файл BaseRepository.php в Cotonti
Файл BaseRepository.php в движке Cotonti CMF является основой для реализации репозиториев, которые взаимодействуют с базой данных. Он представляет собой абстракцию для работы с данными в системе и отвечает за выполнение SQL-запросов для получения информации из базы данных на основе заданных условий. Этот класс реализует общие методы и логику работы с таблицами базы данных, которые могут быть использованы в других репозиториях, специфичных для разных моделей данных.
Основные элементы и функции файла:
-
Используемые компоненты:
Cot: Это глобальный объект фреймворка, который предоставляет доступ к основным функциональностям, включая взаимодействие с базой данных.GetInstanceTrait: Трейт, который позволяет использовать паттерн синглтон для получения экземпляра объекта класса. Это полезно для обеспечения единственности экземпляра репозитория.
-
Переменные и константы:
$tableName: Переменная, которая хранит имя таблицы, с которой работает репозиторий. Это значение будет конкретизироваться в дочерних классах, которые будут использоватьBaseRepository.
-
Основные методы:
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; // В текущей реализации типы не приводятся, просто возвращаем элементы без изменений
}
}
Комментарии (0)
Автор контента
Оффлайн
Administrator
Последняя авторизация: 05.07.2026 18:32
- Страница размещена: 28.01.2025 00:39
- Последнее обновление: 28.01.2025 00:39