20250713 1.1.1
This commit is contained in:
		| @@ -8,7 +8,7 @@ | ||||
| namespace goodboyalex\php_components_pack\classes; | ||||
|  | ||||
| use goodboyalex\php_components_pack\interfaces\ISerializable; | ||||
| use goodboyalex\php_components_pack\models\ActionStateMessageModel; | ||||
| use goodboyalex\php_components_pack\models\ActionStateMessage; | ||||
| use goodboyalex\php_components_pack\traits\ActionState\ActionStateAddTrait; | ||||
| use goodboyalex\php_components_pack\traits\ActionState\ActionStateGetTrait; | ||||
| use goodboyalex\php_components_pack\traits\ActionState\ActionStateHasTrait; | ||||
| @@ -103,7 +103,7 @@ final class ActionState implements ISerializable | ||||
|         // Для каждого сообщения | ||||
|         foreach ($list as $messageSerialized) { | ||||
|             // - создаю новое сообщение | ||||
|             $message = new ActionStateMessageModel(); | ||||
|             $message = new ActionStateMessage(); | ||||
|             // - десериализую его | ||||
|             $message->UnSerialize($messageSerialized); | ||||
|             // - добавляю в список | ||||
|   | ||||
| @@ -9,6 +9,7 @@ use goodboyalex\php_components_pack\traits\ArrayBasicTrait; | ||||
| use goodboyalex\php_components_pack\traits\ObjectArray\ObjectArrayConstantsTrait; | ||||
| use goodboyalex\php_components_pack\traits\ObjectArray\ObjectArrayLINQTrait; | ||||
| use goodboyalex\php_components_pack\traits\ObjectArray\ObjectArraySearchAndSortTrait; | ||||
| use goodboyalex\php_components_pack\traits\ObjectArray\ObjectArraySerializeExTrait; | ||||
| use goodboyalex\php_components_pack\traits\ObjectArray\ObjectArraySpecialTrait; | ||||
| use IteratorAggregate; | ||||
|  | ||||
| @@ -17,7 +18,7 @@ use IteratorAggregate; | ||||
|  * | ||||
|  * @author Александр Бабаев | ||||
|  * @package php_components_pack | ||||
|  * @version 1.0.5 | ||||
|  * @version 1.0.6 | ||||
|  * @since 1.0 | ||||
|  */ | ||||
| final class ObjectArray implements ArrayAccess, IteratorAggregate, Countable, ISerializable | ||||
| @@ -42,6 +43,9 @@ final class ObjectArray implements ArrayAccess, IteratorAggregate, Countable, IS | ||||
|     // Специальные методы | ||||
|     use ObjectArraySpecialTrait; | ||||
|  | ||||
|     // Расширенные методы для сериализации | ||||
|     use ObjectArraySerializeExTrait; | ||||
|  | ||||
|     /** | ||||
|      * Конструктор класса. | ||||
|      * | ||||
|   | ||||
							
								
								
									
										40
									
								
								sources/enums/ObjectArraySerializeMethod.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								sources/enums/ObjectArraySerializeMethod.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| <?php | ||||
|  | ||||
| namespace goodboyalex\php_components_pack\enums; | ||||
|  | ||||
| use goodboyalex\php_components_pack\traits\EnumExtensionsTrait; | ||||
|  | ||||
| /** | ||||
|  * Перечисление типов сериализации массива объектов. | ||||
|  * | ||||
|  * @author Александр Бабаев | ||||
|  * @package php_components_pack | ||||
|  * @version 1.0 | ||||
|  * @since 1.1.1 | ||||
|  */ | ||||
| enum ObjectArraySerializeMethod: int | ||||
| { | ||||
|     // Подключаю расширение для Enum | ||||
|     use EnumExtensionsTrait; | ||||
|  | ||||
|     /** | ||||
|      * Сериализация массива объектов с помощью serialize. | ||||
|      */ | ||||
|     case Serialize = 1; | ||||
|  | ||||
|     /** | ||||
|      * Сериализация массива объектов с помощью json_encode. | ||||
|      * | ||||
|      * @warning Для корректной работы требуется наличие json_encode в php.ini | ||||
|      * @warning Этот способ сериализации НЕ РЕКОМЕНДУЕТСЯ для массивов объектов, представляющих собой классы, так как | ||||
|      *     при десериализации классы не будут созданы: вместо этого будет созданы объекты класса stdClass. Вместо этого | ||||
|      *     следует использовать метод JsonEncodeWithToArray. | ||||
|      */ | ||||
|     case JsonEncode = 2; | ||||
|  | ||||
|     /** | ||||
|      * Сериализация массива объектов с помощью ToArray, который возвращает массив. Этот массив впоследствии | ||||
|      * сериализуется с помощью json_encode. Десерилизация происходит в обратном порядке. | ||||
|      */ | ||||
|     case JsonEncodeWithToArray = 3; | ||||
| } | ||||
| @@ -6,14 +6,14 @@ use goodboyalex\php_components_pack\enums\MessageType; | ||||
| use goodboyalex\php_components_pack\interfaces\ISerializable; | ||||
| 
 | ||||
| /** | ||||
|  * Класс сообщения состояния. | ||||
|  * Модель сообщения о состоянии. | ||||
|  * | ||||
|  * @author Александр Бабаев | ||||
|  * @package php_components_pack | ||||
|  * @version 1.0 | ||||
|  * @version 1.1 | ||||
|  * @since 1.0 | ||||
|  */ | ||||
| final class ActionStateMessageModel implements ISerializable | ||||
| final class ActionStateMessage implements ISerializable | ||||
| { | ||||
|     /** | ||||
|      * @var MessageType $MessageType Тип сообщения | ||||
							
								
								
									
										52
									
								
								sources/models/ObjectArraySerializeOptions.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								sources/models/ObjectArraySerializeOptions.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,52 @@ | ||||
| <?php | ||||
|  | ||||
| namespace goodboyalex\php_components_pack\models; | ||||
|  | ||||
| use Closure; | ||||
| use goodboyalex\php_components_pack\enums\ObjectArraySerializeMethod; | ||||
|  | ||||
| /** | ||||
|  * Класс сообщения состояния. | ||||
|  * | ||||
|  * @author Александр Бабаев | ||||
|  * @package php_components_pack | ||||
|  * @version 1.0 | ||||
|  * @since 1.0 | ||||
|  */ | ||||
| final class ObjectArraySerializeOptions | ||||
| { | ||||
|     /** | ||||
|      * @var ObjectArraySerializeMethod $SerializeMethod Метод сериализации/десериализации. | ||||
|      */ | ||||
|     public ObjectArraySerializeMethod $SerializeMethod; | ||||
|  | ||||
|     /** | ||||
|      * @var Closure|null $OnClassTo Функция обратного вызова для сериализации объекта методом JsonEncodeWithToArray. | ||||
|      *     Она передается в качестве параметра в функцию ToArray и служит для правильного преобразования типа в массив. | ||||
|      */ | ||||
|     public ?Closure $OnClassTo; | ||||
|  | ||||
|     /** | ||||
|      * @var Closure|null $OnClassFrom Функция обратного вызова для десериализации объекта методом | ||||
|      *     JsonEncodeWithToArray. Она передается в качестве параметра в функцию FromArray и служит для правильного | ||||
|      *     преобразования массива в тип. | ||||
|      */ | ||||
|     public ?Closure $OnClassFrom; | ||||
|  | ||||
|     /** | ||||
|      * Конструктор. | ||||
|      * | ||||
|      * @param ObjectArraySerializeMethod $serializeMethod Метод сериализации/десериализации. | ||||
|      * @param callable|null $onClassTo Функция обратного вызова для сериализации объекта методом JsonEncodeWithToArray | ||||
|      *     (для ToArray). | ||||
|      * @param callable|null $onClassFrom Функция обратного вызова для десериализации объекта методом | ||||
|      *     JsonEncodeWithToArray (для FromArray). | ||||
|      */ | ||||
|     public function __construct (ObjectArraySerializeMethod $serializeMethod = ObjectArraySerializeMethod::Serialize, | ||||
|         ?callable $onClassTo = null, ?callable $onClassFrom = null) | ||||
|     { | ||||
|         $this->SerializeMethod = $serializeMethod; | ||||
|         $this->OnClassTo = $onClassTo; | ||||
|         $this->OnClassFrom = $onClassFrom; | ||||
|     } | ||||
| } | ||||
| @@ -5,7 +5,7 @@ namespace goodboyalex\php_components_pack\traits\ActionState; | ||||
| use goodboyalex\php_components_pack\classes\ActionState; | ||||
| use goodboyalex\php_components_pack\classes\ObjectArray; | ||||
| use goodboyalex\php_components_pack\enums\MessageType; | ||||
| use goodboyalex\php_components_pack\models\ActionStateMessageModel; | ||||
| use goodboyalex\php_components_pack\models\ActionStateMessage; | ||||
|  | ||||
| /** | ||||
|  * Часть кода класса ActionState, отвечающая за методы добавления сообщений. | ||||
| @@ -30,7 +30,7 @@ trait ActionStateAddTrait | ||||
|         // Если нужно очистить список сообщений | ||||
|         if ($clearAllBefore) | ||||
|             // - то очищаю список сообщений | ||||
|             $this->Clear(fn (ActionStateMessageModel $message) => true); | ||||
|             $this->Clear(fn (ActionStateMessage $message) => true); | ||||
|  | ||||
|         // Добавляю сообщения из другого состояния | ||||
|         $this->AddRange($state->GetMessages(ActionState::GET_STRING_ALL())); | ||||
| @@ -61,17 +61,17 @@ trait ActionStateAddTrait | ||||
|      */ | ||||
|     public function AddCritical (string $message): void | ||||
|     { | ||||
|         $this->Add(new ActionStateMessageModel(MessageType::Error, true, $message)); | ||||
|         $this->Add(new ActionStateMessage(MessageType::Error, true, $message)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Добавление сообщения. | ||||
|      * | ||||
|      * @param ActionStateMessageModel $message Сообщение | ||||
|      * @param ActionStateMessage $message Сообщение | ||||
|      * | ||||
|      * @return void | ||||
|      */ | ||||
|     public function Add (ActionStateMessageModel $message): void | ||||
|     public function Add (ActionStateMessage $message): void | ||||
|     { | ||||
|         $this->Messages->Add($message); | ||||
|     } | ||||
| @@ -85,7 +85,7 @@ trait ActionStateAddTrait | ||||
|      */ | ||||
|     public function AddError (string $message): void | ||||
|     { | ||||
|         $this->Add(new ActionStateMessageModel(MessageType::Error, false, $message)); | ||||
|         $this->Add(new ActionStateMessage(MessageType::Error, false, $message)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -97,7 +97,7 @@ trait ActionStateAddTrait | ||||
|      */ | ||||
|     public function AddWarning (string $message): void | ||||
|     { | ||||
|         $this->Add(new ActionStateMessageModel(MessageType::Warning, false, $message)); | ||||
|         $this->Add(new ActionStateMessage(MessageType::Warning, false, $message)); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -109,6 +109,6 @@ trait ActionStateAddTrait | ||||
|      */ | ||||
|     public function AddInfo (string $message): void | ||||
|     { | ||||
|         $this->Add(new ActionStateMessageModel(MessageType::Info, false, $message)); | ||||
|         $this->Add(new ActionStateMessage(MessageType::Info, false, $message)); | ||||
|     } | ||||
| } | ||||
| @@ -3,7 +3,7 @@ | ||||
| namespace goodboyalex\php_components_pack\traits\ActionState; | ||||
|  | ||||
| use goodboyalex\php_components_pack\enums\MessageType; | ||||
| use goodboyalex\php_components_pack\models\ActionStateMessageModel; | ||||
| use goodboyalex\php_components_pack\models\ActionStateMessage; | ||||
|  | ||||
| /** | ||||
|  * Часть кода класса ActionState, отвечающая за методы проверки на наличие сообщений. | ||||
| @@ -22,7 +22,7 @@ trait ActionStateHasTrait | ||||
|      */ | ||||
|     public function HasInfos (): bool | ||||
|     { | ||||
|         return $this->Messages->IsExist(fn (ActionStateMessageModel $message) | ||||
|         return $this->Messages->IsExist(fn (ActionStateMessage $message) | ||||
|             => $message->MessageType | ||||
|             == MessageType::Info); | ||||
|     } | ||||
| @@ -48,7 +48,7 @@ trait ActionStateHasTrait | ||||
|      */ | ||||
|     public function HasErrors (bool $onlyCritical = false): bool | ||||
|     { | ||||
|         return $this->Messages->IsExist(fn (ActionStateMessageModel $message): bool | ||||
|         return $this->Messages->IsExist(fn (ActionStateMessage $message): bool | ||||
|             => $onlyCritical | ||||
|             ? $message->MessageType == MessageType::Error && $message->IsCritical | ||||
|             : $message->MessageType == MessageType::Error); | ||||
| @@ -61,7 +61,7 @@ trait ActionStateHasTrait | ||||
|      */ | ||||
|     public function HasWarnings (): bool | ||||
|     { | ||||
|         return $this->Messages->IsExist(fn (ActionStateMessageModel $message) | ||||
|         return $this->Messages->IsExist(fn (ActionStateMessage $message) | ||||
|             => $message->MessageType | ||||
|             == MessageType::Warning); | ||||
|     } | ||||
|   | ||||
| @@ -4,7 +4,7 @@ namespace goodboyalex\php_components_pack\traits\ActionState; | ||||
|  | ||||
| use Closure; | ||||
| use goodboyalex\php_components_pack\enums\MessageType; | ||||
| use goodboyalex\php_components_pack\models\ActionStateMessageModel; | ||||
| use goodboyalex\php_components_pack\models\ActionStateMessage; | ||||
|  | ||||
| /** | ||||
|  * Часть кода класса ActionState, отвечающая за статичные методы и константы. | ||||
| @@ -23,7 +23,7 @@ trait ActionStateStaticTrait | ||||
|      */ | ||||
|     public static function GET_STRING_ERROR_ONLY (): Closure | ||||
|     { | ||||
|         return fn (ActionStateMessageModel $message) | ||||
|         return fn (ActionStateMessage $message) | ||||
|             => $message->MessageType === MessageType::Error; | ||||
|     } | ||||
|  | ||||
| @@ -34,7 +34,7 @@ trait ActionStateStaticTrait | ||||
|      */ | ||||
|     public static function GET_STRING_ERROR_AND_WARNING (): Closure | ||||
|     { | ||||
|         return fn (ActionStateMessageModel $message) | ||||
|         return fn (ActionStateMessage $message) | ||||
|             => $message->MessageType === MessageType::Error | ||||
|             || $message->MessageType === MessageType::Warning; | ||||
|     } | ||||
| @@ -46,6 +46,6 @@ trait ActionStateStaticTrait | ||||
|      */ | ||||
|     public static function GET_STRING_ALL (): Closure | ||||
|     { | ||||
|         return fn (ActionStateMessageModel $message) => true; | ||||
|         return fn (ActionStateMessage $message) => true; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										176
									
								
								sources/traits/ObjectArray/ObjectArraySerializeExTrait.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										176
									
								
								sources/traits/ObjectArray/ObjectArraySerializeExTrait.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,176 @@ | ||||
| <?php | ||||
|  | ||||
| namespace goodboyalex\php_components_pack\traits\ObjectArray; | ||||
|  | ||||
| use goodboyalex\php_components_pack\classes\ObjectArray; | ||||
| use goodboyalex\php_components_pack\enums\ObjectArraySerializeMethod; | ||||
| use goodboyalex\php_components_pack\exceptions\TypeException; | ||||
| use goodboyalex\php_components_pack\extensions\TypeExtension; | ||||
| use goodboyalex\php_components_pack\models\ObjectArraySerializeOptions; | ||||
|  | ||||
| /** | ||||
|  * Часть кода класса ObjectArray, отвечающая за расширенный функции сериализации. | ||||
|  * | ||||
|  * @author Александр Бабаев | ||||
|  * @package php_components_pack | ||||
|  * @version 1.0 | ||||
|  * @since 1.1.1 | ||||
|  */ | ||||
| trait ObjectArraySerializeExTrait | ||||
| { | ||||
|     /** | ||||
|      * Десериализует массив объектов. | ||||
|      * | ||||
|      * @param string $serialized Сериализованный массив. | ||||
|      * @param ObjectArraySerializeOptions|null $options Настройки сериализации. По умолчанию используется настройка по | ||||
|      *     умолчанию. | ||||
|      * | ||||
|      * @return ObjectArray Массив объектов. | ||||
|      */ | ||||
|     public static function UnSerializeEx (string $serialized, ?ObjectArraySerializeOptions $options = null): ObjectArray | ||||
|     { | ||||
|         // По умолчанию используем настройки по умолчанию | ||||
|         $options ??= new ObjectArraySerializeOptions(); | ||||
|  | ||||
|         // Десериализуем массив объектов | ||||
|         return match ($options->SerializeMethod) { | ||||
|             // - стандартный метод UnSerialize | ||||
|             ObjectArraySerializeMethod::Serialize => self::UnSerializeBySerialize($serialized), | ||||
|             // - метод JsonEncode | ||||
|             ObjectArraySerializeMethod::JsonEncode => self::UnSerializeByJsonEncode($serialized), | ||||
|             // - метод JsonEncodeWithToArray | ||||
|             ObjectArraySerializeMethod::JsonEncodeWithToArray => self::UnSerializeByJsonEncodeWithToArray($serialized, | ||||
|                 $options->OnClassFrom) | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Десериализует массив объектов с помощью стандартного метода UnSerialize. | ||||
|      * | ||||
|      * @param string $serialized Сериализованный массив. | ||||
|      * | ||||
|      * @return ObjectArray Массив объектов. | ||||
|      */ | ||||
|     private static function UnSerializeBySerialize (string $serialized): ObjectArray | ||||
|     { | ||||
|         // Создаем новый объект | ||||
|         $result = new ObjectArray(); | ||||
|  | ||||
|         // Десериализуем массив объектов с помощью стандартного метода | ||||
|         $result->UnSerialize($serialized); | ||||
|  | ||||
|         // Возвращаем результат | ||||
|         return $result; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Десериализует массив объектов с помощью метода JsonEncode. | ||||
|      * | ||||
|      * @param string $serialized Сериализованный массив. | ||||
|      * | ||||
|      * @return ObjectArray Массив объектов. | ||||
|      */ | ||||
|     private static function UnSerializeByJsonEncode (string $serialized): ObjectArray | ||||
|     { | ||||
|         // Десериализуем массив | ||||
|         $container = json_decode($serialized, false, flags: JSON_UNESCAPED_UNICODE); | ||||
|  | ||||
|         // Создаем новый объект | ||||
|         return new ObjectArray($container); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Десериализует массив объектов с помощью метода JsonEncodeWithToArray. | ||||
|      * | ||||
|      * @param string $serialized Сериализованный массив. | ||||
|      * @param callable|null $onClass Функция обратного вызова для десериализации объекта методом JsonEncodeWithToArray. | ||||
|      *     Она передается в качестве параметра в функцию FromArray и служит для правильного преобразования массива в | ||||
|      *     тип. | ||||
|      * | ||||
|      * @return ObjectArray Массив объектов. | ||||
|      */ | ||||
|     private static function UnSerializeByJsonEncodeWithToArray (string $serialized, ?callable $onClass): ObjectArray | ||||
|     { | ||||
|         // Десериализуем массив | ||||
|         $container = json_decode($serialized, true, flags: JSON_UNESCAPED_UNICODE); | ||||
|  | ||||
|         // Создаем новый объект, в который будем помещать объекты | ||||
|         $result = new ObjectArray(); | ||||
|  | ||||
|         // Переберем все объекты в контейнере | ||||
|         foreach ($container as $item) | ||||
|             try { | ||||
|                 // - пробуем преобразовать массив в объект, если это возможно | ||||
|                 $result[] = TypeExtension::FromArray($item, $onClass); | ||||
|             } | ||||
|             catch (TypeException) { | ||||
|                 // - если не получилось, то просто добавляем объект в массив | ||||
|                 $result[] = $item; | ||||
|             } | ||||
|  | ||||
|         // Возвращаем результат | ||||
|         return $result; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Сериализует массив объектов. | ||||
|      * | ||||
|      * @param ObjectArraySerializeOptions|null $options Настройки сериализации. По умолчанию используется настройка по | ||||
|      *     умолчанию. | ||||
|      * | ||||
|      * @return string Сериализованный массив. | ||||
|      */ | ||||
|     public function SerializeEx (?ObjectArraySerializeOptions $options = null): string | ||||
|     { | ||||
|         // По умолчанию используем настройки по умолчанию | ||||
|         $options ??= new ObjectArraySerializeOptions(); | ||||
|  | ||||
|         // Сериализуем массив | ||||
|         return match ($options->SerializeMethod) { | ||||
|             // - стандартный метод Serialize | ||||
|             ObjectArraySerializeMethod::Serialize => $this->Serialize(), | ||||
|             // - метод JsonEncode | ||||
|             ObjectArraySerializeMethod::JsonEncode => $this->SerializeByJsonEncode(), | ||||
|             // - метод JsonEncodeWithToArray | ||||
|             ObjectArraySerializeMethod::JsonEncodeWithToArray => $this->SerializeByJsonEncodeWithToArray($options->OnClassTo) | ||||
|         }; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Сериализует массив методом JsonEncode. | ||||
|      * | ||||
|      * @return string Сериализованный массив. | ||||
|      */ | ||||
|     private function SerializeByJsonEncode (): string | ||||
|     { | ||||
|         return json_encode($this->Container, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Сериализует массив методом JsonEncodeWithToArray. | ||||
|      * | ||||
|      * @param callable|null $onClass Функция обратного вызова для сериализации объекта методом JsonEncodeWithToArray. | ||||
|      *     Она передается в качестве параметра в функцию ToArray и служит для правильного преобразования типа в массив. | ||||
|      * | ||||
|      * @return string Сериализованный массив. | ||||
|      */ | ||||
|     private function SerializeByJsonEncodeWithToArray (?callable $onClass): string | ||||
|     { | ||||
|         // Создадим массив, в который будем помещать объекты | ||||
|         $container = []; | ||||
|  | ||||
|         // Переберем все объекты в контейнере | ||||
|         foreach ($this->Container as $item) | ||||
|             try { | ||||
|                 // - пробуем преобразовать объект в массив, если это возможно | ||||
|                 $container[] = TypeExtension::ToArray($item, $onClass); | ||||
|             } | ||||
|             catch (TypeException) { | ||||
|                 // - если не получилось, то просто добавляем объект в массив | ||||
|                 $container[] = $item; | ||||
|             } | ||||
|  | ||||
|         // Возвращаем сериализованный массив | ||||
|         return json_encode($container, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user