20250711 1.1.1 Beta 3
This commit is contained in:
		| @@ -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