20250709 1.1.1 Beta 2
This commit is contained in:
168
sources/extensions/TypeExtension.php
Normal file
168
sources/extensions/TypeExtension.php
Normal file
@@ -0,0 +1,168 @@
|
||||
<?php
|
||||
|
||||
namespace goodboyalex\php_components_pack\extensions;
|
||||
|
||||
use DateMalformedStringException;
|
||||
use DateTime;
|
||||
use DateTimeImmutable;
|
||||
use DateTimeInterface;
|
||||
use Exception;
|
||||
use UnitEnum;
|
||||
|
||||
/**
|
||||
* Расширение для любого типа.
|
||||
*
|
||||
* @author Александр Бабаев
|
||||
* @package php_components_pack
|
||||
* @version 1.0
|
||||
* @since 1.1.1
|
||||
*/
|
||||
final class TypeExtension
|
||||
{
|
||||
/**
|
||||
* Переводит объект в массив.
|
||||
*
|
||||
* @return array Массив свойств типа.
|
||||
*/
|
||||
public function ToArray (object $class): array
|
||||
{
|
||||
// Создаю массив результата
|
||||
$result = [];
|
||||
|
||||
// Получаю свойства класса
|
||||
$properties = get_object_vars($class);
|
||||
|
||||
// Для каждого свойства класса
|
||||
foreach ($properties as $key => $value) {
|
||||
// - если значение является датой
|
||||
if ($value instanceof DateTimeInterface) {
|
||||
|
||||
// -- добавляю в массив
|
||||
$result[$key] = $value->getTimestamp();
|
||||
|
||||
// -- следующий элемент
|
||||
continue;
|
||||
}
|
||||
|
||||
// - если значение является перечислением
|
||||
if ($value instanceof UnitEnum) {
|
||||
// -- получаю перечисление
|
||||
$result[$key] = $value->name;
|
||||
|
||||
// -- следующий элемент
|
||||
continue;
|
||||
}
|
||||
|
||||
// - если значение является NULL
|
||||
if (is_null($value)) {
|
||||
// -- присваиваю NULL
|
||||
$result[$key] = "null";
|
||||
// -- следующий элемент
|
||||
continue;
|
||||
}
|
||||
|
||||
// - присваиваю значение
|
||||
$result[$key] = $value;
|
||||
}
|
||||
|
||||
// Возвращаю результат
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Переводит массив в объект.
|
||||
*
|
||||
* @param array $array Массив свойств.
|
||||
* @param string $className Требуемый класс (внимание: с namespace!).
|
||||
*
|
||||
* @return mixed Объект типа $className.
|
||||
* @throws Exception Исключение, если объект не создан, или дата не корректного формата или пытается передать null
|
||||
* не nullable типу.
|
||||
*/
|
||||
public function FromArray (array $array, string $className): object
|
||||
{
|
||||
// Создаем объект
|
||||
$instance = new $className();
|
||||
|
||||
// Проверяем, что объект создан
|
||||
if (!is_object($instance) && $instance instanceof $className)
|
||||
// - если нет, то выбрасываю исключение
|
||||
throw new Exception("Object is not created / Объект не создан.");
|
||||
|
||||
// Получаю свойства класса
|
||||
$properties = get_object_vars($instance);
|
||||
|
||||
// Для каждого свойства класса
|
||||
foreach ($properties as $key => $value) {
|
||||
// - проверяю, есть ли свойство в массиве
|
||||
if (!array_key_exists($key, $array))
|
||||
// -- если нет, то пропускаю
|
||||
continue;
|
||||
|
||||
// - получаю значение из массива
|
||||
$value = $array[$key];
|
||||
|
||||
// - если значение является датой DateTime
|
||||
if ($instance->$key instanceof DateTime && is_int($value)) {
|
||||
// -- присваиваю значение
|
||||
try {
|
||||
$instance->$key = new DateTime ('@' . $value);
|
||||
}
|
||||
catch (DateMalformedStringException) {
|
||||
throw new Exception("Date is not correct format / Дата не корректного формата.");
|
||||
}
|
||||
|
||||
// -- следующий элемент
|
||||
continue;
|
||||
}
|
||||
|
||||
// - если значение является датой DateTimeImmutable
|
||||
if ($instance->$key instanceof DateTimeImmutable && is_int($value)) {
|
||||
// -- присваиваю значение
|
||||
try {
|
||||
$instance->$key = new DateTimeImmutable('@' . $value);
|
||||
}
|
||||
catch (DateMalformedStringException) {
|
||||
// -- создаю дату с нулевым временем, если ошибка
|
||||
$instance->$key = new DateTimeImmutable();
|
||||
}
|
||||
|
||||
// -- следующий элемент
|
||||
continue;
|
||||
}
|
||||
|
||||
// - если значение является перечислением
|
||||
if ($instance->$key instanceof UnitEnum) {
|
||||
// -- получаю все значения перечисления
|
||||
foreach ($instance->$key::getCases() as $case)
|
||||
// --- если значение совпадает
|
||||
if ($case->name === $value)
|
||||
// ---- присваиваю значение
|
||||
$instance->$key = $case;
|
||||
|
||||
// -- следующий элемент
|
||||
continue;
|
||||
}
|
||||
|
||||
// - если значение является NULL
|
||||
if ($value = "null") {
|
||||
// -- присваиваю NULL
|
||||
try {
|
||||
$instance->$key = null;
|
||||
}
|
||||
catch (Exception $exception) {
|
||||
throw new Exception("Cannot assign null to non-nullable property. / Невозможно присвоить null не nullable типу: {$exception->getMessage()}.");
|
||||
}
|
||||
|
||||
// -- следующий элемент
|
||||
continue;
|
||||
}
|
||||
|
||||
// - присваиваю значение
|
||||
$instance->$key = $value;
|
||||
}
|
||||
|
||||
// Возвращаю объект
|
||||
return $instance;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user