20250711 1.1.1 Beta 3
This commit is contained in:
36
sources/exceptions/TypeException.php
Normal file
36
sources/exceptions/TypeException.php
Normal file
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace goodboyalex\php_components_pack\exceptions;
|
||||
|
||||
use Exception;
|
||||
|
||||
/**
|
||||
* Ошибка работы с расширением типов.
|
||||
*
|
||||
* @author Александр Бабаев
|
||||
* @package php_components_pack
|
||||
* @version 1.0
|
||||
* @since 1.1.1
|
||||
*/
|
||||
final class TypeException extends Exception
|
||||
{
|
||||
/**
|
||||
* @var string $TypeName Имя типа.
|
||||
*/
|
||||
public string $TypeName;
|
||||
|
||||
/**
|
||||
* Конструктор.
|
||||
*
|
||||
* @param string $typeName Имя типа.
|
||||
* @param string $message Сообщение об ошибке.
|
||||
*/
|
||||
public function __construct (string $typeName = "", string $message = "")
|
||||
{
|
||||
// Запускаем базовый конструктор
|
||||
parent::__construct($message);
|
||||
|
||||
// Присваиваем тип
|
||||
$this->TypeName = $typeName;
|
||||
}
|
||||
}
|
@@ -2,11 +2,13 @@
|
||||
|
||||
namespace goodboyalex\php_components_pack\extensions;
|
||||
|
||||
use Closure;
|
||||
use DateMalformedStringException;
|
||||
use DateTime;
|
||||
use DateTimeImmutable;
|
||||
use DateTimeInterface;
|
||||
use Exception;
|
||||
use goodboyalex\php_components_pack\exceptions\TypeException;
|
||||
use UnitEnum;
|
||||
|
||||
/**
|
||||
@@ -19,16 +21,38 @@ use UnitEnum;
|
||||
*/
|
||||
final class TypeExtension
|
||||
{
|
||||
/**
|
||||
* Дефолтный метод обработки классов для ToArray.
|
||||
*
|
||||
* @return Closure Метод обработки классов для ToArray.
|
||||
*/
|
||||
public static function DEFAULT_TO_ARRAY_ON_CLASS (): Closure
|
||||
{
|
||||
return fn (object $class) => self::ToArray($class, self::DEFAULT_TO_ARRAY_ON_CLASS());
|
||||
}
|
||||
|
||||
/**
|
||||
* Переводит объект в массив.
|
||||
*
|
||||
* @param object $class Объект.
|
||||
* @param callable $onClass Метод обработки классов.
|
||||
*
|
||||
* @return array Массив свойств типа.
|
||||
* @throws TypeException Исключение, если объект не является классом.
|
||||
*/
|
||||
public function ToArray (object $class): array
|
||||
public static function ToArray (object $class, callable $onClass): array
|
||||
{
|
||||
// Создаю массив результата
|
||||
$result = [];
|
||||
|
||||
// Сперва проверяю, что объект является классом
|
||||
if (!is_object($class))
|
||||
// - если нет, то выбрасываю исключение
|
||||
throw new TypeException($class::class, "Object is not class / Объект не является классом.");
|
||||
|
||||
// Затем записываю имя класса
|
||||
$result["type_class"] = $class::class;
|
||||
|
||||
// Получаю свойства класса
|
||||
$properties = get_object_vars($class);
|
||||
|
||||
@@ -61,6 +85,15 @@ final class TypeExtension
|
||||
continue;
|
||||
}
|
||||
|
||||
// - если значение является классом
|
||||
if (is_object($value)) {
|
||||
// -- добавляю в массив через рекурсию
|
||||
$result[$key] = $onClass($value);
|
||||
|
||||
// -- следующий элемент
|
||||
continue;
|
||||
}
|
||||
|
||||
// - присваиваю значение
|
||||
$result[$key] = $value;
|
||||
}
|
||||
@@ -73,21 +106,28 @@ final class TypeExtension
|
||||
* Переводит массив в объект.
|
||||
*
|
||||
* @param array $array Массив свойств.
|
||||
* @param string $className Требуемый класс (внимание: с namespace!).
|
||||
*
|
||||
* @return mixed Объект типа $className.
|
||||
* @throws Exception Исключение, если объект не создан, или дата не корректного формата или пытается передать null
|
||||
* не nullable типу.
|
||||
* @throws TypeException Исключение, если массив не создан через ToArray, объект не создан, дата не корректного
|
||||
* формата или пытается передать null не nullable типу.
|
||||
*/
|
||||
public function FromArray (array $array, string $className): object
|
||||
public function FromArray (array $array): object
|
||||
{
|
||||
// Проверяю, что массив является массивом, созданным через ToArray, то есть содержит ключ type_class
|
||||
if (!array_key_exists("type_class", $array))
|
||||
// - если нет, то выбрасываю исключение
|
||||
throw new TypeException("array", "Array is not created by ToArray / Массив не создан через ToArray.");
|
||||
|
||||
// Получаю имя класса
|
||||
$className = $array["type_class"];
|
||||
|
||||
// Создаем объект
|
||||
$instance = new $className();
|
||||
|
||||
// Проверяем, что объект создан
|
||||
if (!is_object($instance) && $instance instanceof $className)
|
||||
// - если нет, то выбрасываю исключение
|
||||
throw new Exception("Object is not created / Объект не создан.");
|
||||
throw new TypeException($className, "Object is not created / Объект не создан.");
|
||||
|
||||
// Получаю свойства класса
|
||||
$properties = get_object_vars($instance);
|
||||
@@ -109,7 +149,8 @@ final class TypeExtension
|
||||
$instance->$key = new DateTime ('@' . $value);
|
||||
}
|
||||
catch (DateMalformedStringException) {
|
||||
throw new Exception("Date is not correct format / Дата не корректного формата.");
|
||||
throw new TypeException($className . "->{$key}::DateTime",
|
||||
"Date is not correct format / Дата не корректного формата.");
|
||||
}
|
||||
|
||||
// -- следующий элемент
|
||||
@@ -123,8 +164,8 @@ final class TypeExtension
|
||||
$instance->$key = new DateTimeImmutable('@' . $value);
|
||||
}
|
||||
catch (DateMalformedStringException) {
|
||||
// -- создаю дату с нулевым временем, если ошибка
|
||||
$instance->$key = new DateTimeImmutable();
|
||||
throw new TypeException($className . "->{$key}::DateTimeImmutable",
|
||||
"Date is not correct format / Дата не корректного формата.");
|
||||
}
|
||||
|
||||
// -- следующий элемент
|
||||
@@ -151,13 +192,23 @@ final class TypeExtension
|
||||
$instance->$key = null;
|
||||
}
|
||||
catch (Exception $exception) {
|
||||
throw new Exception("Cannot assign null to non-nullable property. / Невозможно присвоить null не nullable типу: {$exception->getMessage()}.");
|
||||
throw new TypeException($className . "->$key",
|
||||
"Cannot assign null to non-nullable property. / Невозможно присвоить null не nullable типу: {$exception->getMessage()}.");
|
||||
}
|
||||
|
||||
// -- следующий элемент
|
||||
continue;
|
||||
}
|
||||
|
||||
// - если значение является классом
|
||||
if (is_object($instance->$key) && is_array($array[$key]) && array_key_exists("type_class", $array[$key])) {
|
||||
// -- добавляю в массив через рекурсию
|
||||
$instance->$key = self::FromArray($array[$key]);
|
||||
|
||||
// -- следующий элемент
|
||||
continue;
|
||||
}
|
||||
|
||||
// - присваиваю значение
|
||||
$instance->$key = $value;
|
||||
}
|
||||
|
Reference in New Issue
Block a user