81 lines
3.5 KiB
PHP
81 lines
3.5 KiB
PHP
<?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 string|array|null $fromType Метод конвертации из типа для заполнения таблицы базы данных (может
|
||
* быть строкой (имя функции), может быть массивом (имя класса, имя метода) и null (по умолчанию)).
|
||
* @param string|array|null $toType Метод конвертации в тип для заполнения таблицы базы данных (может быть
|
||
* строкой (имя функции), может быть массивом (имя класса, имя метода) и null (по умолчанию)).
|
||
*/
|
||
public function __construct (string|array|null $fromType = null, string|array|null $toType = null)
|
||
{
|
||
$this->ConvertToDB = $fromType;
|
||
$this->ConvertFromDB = $toType;
|
||
}
|
||
|
||
/**
|
||
* Создает замыкание из переданного значения
|
||
*
|
||
* @param string|array|null $callbackData Данные для создания колбэка
|
||
*
|
||
* @return Closure|null
|
||
*/
|
||
private function CreateCallback (string|array|null $callbackData): ?Closure
|
||
{
|
||
// Если передан null
|
||
if ($callbackData === null)
|
||
// - возвращаем null
|
||
return null;
|
||
|
||
// Если передана строка - считаем это именем статического метода
|
||
if (is_string($callbackData))
|
||
// - создаём замыкание и возращаем его
|
||
return static fn (mixed $value): mixed
|
||
=> call_user_func($callbackData, $value);
|
||
|
||
// Если передан массив [класс, метод]
|
||
if (is_array($callbackData)) {
|
||
// - разбираем его
|
||
[$class, $method] = $callbackData;
|
||
|
||
// - создаём замыкание и возращаем его
|
||
return static fn (mixed $value): mixed
|
||
=> call_user_func([$class, $method], $value);
|
||
}
|
||
|
||
// В случае ошибки возвращаем null
|
||
return null;
|
||
}
|
||
} |