This commit is contained in:
Александр Бабаев 2025-07-30 18:33:02 +03:00
parent 8436569ce5
commit 45fb57981d
7 changed files with 323 additions and 159 deletions

View File

@ -2,6 +2,4 @@
[RU] Набор компонентов для сайта на PHP для работы с базами данных [RU] Набор компонентов для сайта на PHP для работы с базами данных
[EN] A set of components for PHP website for work with database [EN] A set of components for PHP website for work with database

View File

@ -0,0 +1,45 @@
<?php
/**
* Отключаю несущественные инспекции (из-за Attribute)
*
* @noinspection PhpMultipleClassDeclarationsInspection
*/
namespace goodboyalex\php_db_components_pack\attributes;
use Attribute;
use Closure;
/**
* Атрибут указания методов конвертации из/в тип для заполнения таблицы базы данных.
*
* @author Александр Бабаев
* @package php_db_components_pack
* @version 1.0
* @since 1.0
*/
#[Attribute(flags: Attribute::TARGET_PROPERTY)]
final readonly class ConvertToDB
{
/**
* @var Closure|null Метод конвертации из типа для заполнения таблицы базы данных.
*/
public ?Closure $ConvertToDB;
/**
* @var Closure|null Метод конвертации в тип для заполнения таблицы базы данных.
*/
public ?Closure $ConvertFromDB;
/**
* Конструктор.
*
* @param callable|null $fromType Метод конвертации из типа для заполнения таблицы базы данных.
* @param callable|null $toType Метод конвертации в тип для заполнения таблицы базы данных.
*/
public function __construct (?callable $fromType = null, ?callable $toType = null)
{
$this->ConvertToDB = $fromType;
$this->ConvertFromDB = $toType;
}
}

View File

@ -0,0 +1,47 @@
<?php
/**
* Отключаю несущественные инспекции (из-за Attribute)
*
* @noinspection PhpMultipleClassDeclarationsInspection
*/
namespace goodboyalex\php_db_components_pack\attributes;
use Attribute;
use goodboyalex\php_components_pack\classes\ObjectArray;
use goodboyalex\php_db_components_pack\enums\DBOperation;
/**
* Атрибут указывающий, что свойство должно игнорироваться при операции с БД.
*
* @author Александр Бабаев
* @package php_db_components_pack
* @version 1.0
* @since 1.0
*/
#[Attribute(flags: Attribute::TARGET_PROPERTY)]
final readonly class IgnoredInDB
{
/**
* @var ObjectArray Игнорируемые операции.
*/
public ObjectArray $IgnoredOperations;
/**
* Конструктор.
*
* @param DBOperation ...$ignoredOperations Список операций, которые игнорируем.
*/
public function __construct (DBOperation ...$ignoredOperations)
{
// Если не указаны операции
if (count($ignoredOperations) === 0)
// - то по умолчанию игнорируем все операции
$ignoredOperations = [
DBOperation::Insert, DBOperation::Get, DBOperation::Update, DBOperation::Delete, DBOperation::Count
];
// Инициализируем массив
$this->IgnoredOperations = new ObjectArray($ignoredOperations);
}
}

View File

@ -0,0 +1,29 @@
<?php
/**
* Отключаю несущественные инспекции (из-за Attribute)
*
* @noinspection PhpMultipleClassDeclarationsInspection
*/
namespace goodboyalex\php_db_components_pack\attributes;
use Attribute;
/**
* Атрибут указания, что параметр является первичным ключом таблицы.
*
* @author Александр Бабаев
* @package php_db_components_pack
* @version 1.0
* @since 1.0
*/
#[Attribute(flags: Attribute::TARGET_PROPERTY)]
final readonly class PrimaryKey
{
/**
* Конструктор
*/
public function __construct ()
{
}
}

View File

@ -1,45 +1,45 @@
<?php <?php
namespace goodboyalex\php_db_components_pack\enums; namespace goodboyalex\php_db_components_pack\enums;
use goodboyalex\php_components_pack\traits\EnumExtensionsTrait; use goodboyalex\php_components_pack\traits\EnumExtensionsTrait;
/**
*Перечисление PDO-драйверов.
*
* @author Александр Бабаев
* @package php_db_components_pack
* @version 1.0
* @since 1.0
* @see \PDO
*/
enum DBDriver: int
{
// Подключаем trait для работы с перечислениями
use EnumExtensionsTrait;
/** /**
* MySQL *Перечисление PDO-драйверов.
*
* @author Александр Бабаев
* @package php_db_components_pack
* @version 1.0
* @since 1.0
* @see \PDO
*/ */
case MySQL = 0; enum DBDriver: int
{
/** // Подключаем trait для работы с перечислениями
* Microsoft SQL use EnumExtensionsTrait;
*/
case MSSQL = 1; /**
* MySQL
/** */
* PostgreSQL case MySQL = 0;
*/
case PostgreSQL = 2; /**
* Microsoft SQL
/** */
* OracleDB case MSSQL = 1;
*/
case OracleDB = 3; /**
* PostgreSQL
/** */
* SQLite case PostgreSQL = 2;
*/
case SQLite = 4; /**
} * OracleDB
*/
case OracleDB = 3;
/**
* SQLite
*/
case SQLite = 4;
}

View File

@ -0,0 +1,45 @@
<?php
namespace goodboyalex\php_db_components_pack\enums;
use goodboyalex\php_components_pack\traits\EnumExtensionsTrait;
/**
*Перечисление операций в БД.
*
* @author Александр Бабаев
* @package php_db_components_pack
* @version 1.0
* @since 1.0
* @see \PDO
*/
enum DBOperation: int
{
// Подключаем trait для работы с перечислениями
use EnumExtensionsTrait;
/**
* Операция вставки.
*/
case Insert = 0;
/**
* Операция получения.
*/
case Get = 1;
/**
* Операция обновления.
*/
case Update = 2;
/**
* Операция удаления.
*/
case Delete = 3;
/**
* Операция подсчета количества.
*/
case Count = 4;
}

View File

@ -1,120 +1,120 @@
<?php <?php
namespace goodboyalex\php_db_components_pack\models; namespace goodboyalex\php_db_components_pack\models;
use goodboyalex\php_components_pack\classes\Encryptor; use goodboyalex\php_components_pack\classes\Encryptor;
use goodboyalex\php_components_pack\interfaces\ISerializable; use goodboyalex\php_components_pack\interfaces\ISerializable;
use goodboyalex\php_db_components_pack\enums\DBDriver; use goodboyalex\php_db_components_pack\enums\DBDriver;
/**
* Модель параметров базы данных.
*
* @author Александр Бабаев
* @package php_components_pack
* @version 1.0
* @since 1.0
*/
final class DBConfig implements ISerializable
{
/** /**
* @var string $Host Хост базы данных. * Модель параметров базы данных.
*/
public string $Host;
/**
* @var int $Port Порт базы данных.
* @between 0...65535
*/
public int $Port;
/**
* @var string $Name Имя базы данных.
*/
public string $Name;
/**
* @var string $UserName Имя пользователя базы данных.
*/
public string $UserName;
/**
* @var string $Password Пароль пользователя базы данных.
*/
public string $Password;
/**
* @var DBDriver $Driver Тип драйвера базы данных.
*/
public DBDriver $Driver;
/**
* @var string $Chipper Пароль шифрования.
*/
private string $Chipper;
/**
* Конструктор.
* *
* @param DBDriver $driver Тип драйвера базы данных. * @author Александр Бабаев
* @param string $host Хост базы данных. * @package php_components_pack
* @param int $port Порт базы данных. * @version 1.0
* @param string $name Имя базы данных. * @since 1.0
* @param string $userName Имя пользователя базы данных.
* @param string $password Пароль пользователя базы данных.
* @param string $chipper Пароль шифрования.
*/ */
public function __construct (DBDriver $driver = DBDriver::MySQL, string $host = "", int $port = 0, final class DBConfig implements ISerializable
string $name = "", string $userName = "", string $password = "", string $chipper = "")
{ {
$this->Driver = $driver; /**
$this->Host = $host; * @var string $Host Хост базы данных.
$this->Port = $port; */
$this->Name = $name; public string $Host;
$this->UserName = $userName;
$this->Password = $password; /**
$this->Chipper = $chipper; * @var int $Port Порт базы данных.
} * @between 0...65535
*/
/** public int $Port;
* @inheritDoc
*/ /**
public function UnSerialize (string $serialized): void * @var string $Name Имя базы данных.
{ */
// Десериализую массив public string $Name;
$array = json_decode($serialized, true);
/**
// Заполняю поля * @var string $UserName Имя пользователя базы данных.
if (isset($array["host"])) */
$this->Host = $array["host"]; public string $UserName;
if (isset($array["port"]))
$this->Port = $array["port"]; /**
if (isset($array["name"])) * @var string $Password Пароль пользователя базы данных.
$this->Name = $array["name"]; */
if (isset($array["user"])) public string $Password;
$this->UserName = $array["user"];
if (isset($array["password"])) /**
$this->Password = Encryptor::Decrypt($array["password"], $this->Chipper); * @var DBDriver $Driver Тип драйвера базы данных.
if (isset($array["driver"])) */
$this->Driver = DBDriver::FromInt($array["driver"]); public DBDriver $Driver;
}
/**
/** * @var string $Chipper Пароль шифрования.
* @inheritDoc */
*/ private string $Chipper;
public function Serialize (): string
{ /**
// Создаю массив результата * Конструктор.
$result = []; *
* @param DBDriver $driver Тип драйвера базы данных.
// Заполняю массив * @param string $host Хост базы данных.
$result["host"] = $this->Host; * @param int $port Порт базы данных.
$result["port"] = $this->Port; * @param string $name Имя базы данных.
$result["name"] = $this->Name; * @param string $userName Имя пользователя базы данных.
$result["user"] = $this->UserName; * @param string $password Пароль пользователя базы данных.
$result["password"] = Encryptor::Encrypt($this->Password, $this->Chipper); * @param string $chipper Пароль шифрования.
$result["driver"] = $this->Driver->ToInt(); */
public function __construct (DBDriver $driver = DBDriver::MySQL, string $host = "", int $port = 0,
// Сериализую string $name = "", string $userName = "", string $password = "", string $chipper = "")
return json_encode($result, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); {
} $this->Driver = $driver;
} $this->Host = $host;
$this->Port = $port;
$this->Name = $name;
$this->UserName = $userName;
$this->Password = $password;
$this->Chipper = $chipper;
}
/**
* @inheritDoc
*/
public function UnSerialize (string $serialized): void
{
// Десериализую массив
$array = json_decode($serialized, true);
// Заполняю поля
if (isset($array["host"]))
$this->Host = $array["host"];
if (isset($array["port"]))
$this->Port = $array["port"];
if (isset($array["name"]))
$this->Name = $array["name"];
if (isset($array["user"]))
$this->UserName = $array["user"];
if (isset($array["password"]))
$this->Password = Encryptor::Decrypt($array["password"], $this->Chipper);
if (isset($array["driver"]))
$this->Driver = DBDriver::FromInt($array["driver"]);
}
/**
* @inheritDoc
*/
public function Serialize (): string
{
// Создаю массив результата
$result = [];
// Заполняю массив
$result["host"] = $this->Host;
$result["port"] = $this->Port;
$result["name"] = $this->Name;
$result["user"] = $this->UserName;
$result["password"] = Encryptor::Encrypt($this->Password, $this->Chipper);
$result["driver"] = $this->Driver->ToInt();
// Сериализую
return json_encode($result, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
}
}