109 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			109 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace goodboyalex\php_components_pack\traits\JsonReWriter;
 | |
| 
 | |
| use goodboyalex\php_components_pack\enums\JsonErrorCode;
 | |
| use goodboyalex\php_components_pack\exceptions\JsonException;
 | |
| use goodboyalex\php_components_pack\interfaces\ISerializable;
 | |
| 
 | |
| /**
 | |
|  * Часть кода класса JsonReWriter, отвечающая за методы записи ключей и значений JSON.
 | |
|  *
 | |
|  * @author Александр Бабаев
 | |
|  * @package php_components_pack
 | |
|  * @version 1.0
 | |
|  * @since 1.1.0
 | |
|  */
 | |
| trait JsonReWriterWriteTrait
 | |
| {
 | |
|     /**
 | |
|      * Записывает объект в ключ JSON.
 | |
|      *
 | |
|      * @param string $key Ключ JSON.
 | |
|      * @param object $value Записываемое значение.
 | |
|      *
 | |
|      * @return void
 | |
|      * @throws JsonException Ключ не содержит вложений, хотя от него требуется обратное.
 | |
|      */
 | |
|     public function WriteObject (string $key, object $value): void
 | |
|     {
 | |
|         $this->Write($key, json_encode($value));
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Записывает значение в ключ JSON.
 | |
|      *
 | |
|      * @param string $key Ключ JSON.
 | |
|      * @param mixed $value Записываемое значение.
 | |
|      *
 | |
|      * @return void
 | |
|      * @throws JsonException Ключ не содержит вложений, хотя от него требуется обратное.
 | |
|      */
 | |
|     public function Write (string $key, mixed $value): void
 | |
|     {
 | |
|         // Подготавливаем ключ
 | |
|         $key = $this->PrepareKey($key);
 | |
| 
 | |
|         // Получаем массив ключей по вложенности
 | |
|         $keys = $this->ParseKey($key);
 | |
| 
 | |
|         // Получаем текущий массив данных
 | |
|         $current = &$this->JsonData;
 | |
| 
 | |
|         // Для каждого ключа до предпоследнего
 | |
|         for ($i = 0; $i < count($keys) - 1; $i++) {
 | |
|             // - проверяем наличие ключа в текущем массиве
 | |
|             if (!isset($current[$keys[$i]]))
 | |
|                 // - нет? Создаем ключ (массив)
 | |
|                 $current[$keys[$i]] = [];
 | |
| 
 | |
|             // - проверяем, что ключ является массивом
 | |
|             if (!is_array($current[$keys[$i]]))
 | |
|                 // - нет? Выбрасываем исключение
 | |
|                 throw new JsonException(errorCode: JsonErrorCode::KeyIsNotArray,
 | |
|                     errorMessage: "The key does not contain attachments, although it is required to do the opposite / Ключ не содержит вложений, хотя от него требуется обратное!");
 | |
| 
 | |
|             // - переходим ко вложенному массиву
 | |
|             $current = &$current[$keys[$i]];
 | |
|         }
 | |
| 
 | |
|         // Создаем ключ (значение)
 | |
|         $current[$keys[count($keys) - 1]] = $value;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Записывает объект, реализующий интерфейс ISerializable, в ключ JSON.
 | |
|      *
 | |
|      * @param string $key Ключ JSON.
 | |
|      * @param ISerializable $serializableValue Записываемый объект, реализующий интерфейс ISerializable.
 | |
|      *
 | |
|      * @return void
 | |
|      * @throws JsonException Ключ не содержит вложений, хотя от него требуется обратное.
 | |
|      */
 | |
|     public function WriteSerializable (string $key, ISerializable $serializableValue): void
 | |
|     {
 | |
|         // Сериализуем объект
 | |
|         $serialized = $serializableValue->Serialize();
 | |
| 
 | |
|         // Записываем в ключ
 | |
|         $this->Write($key, $serialized);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Записывает массив в ключ JSON.
 | |
|      *
 | |
|      * @param string $key Ключ JSON.
 | |
|      * @param array $array Массив для записи.
 | |
|      *
 | |
|      * @return void
 | |
|      * @throws JsonException Ключ не содержит вложений, хотя от него требуется обратное.
 | |
|      */
 | |
|     public function WriteArray (string $key, array $array): void
 | |
|     {
 | |
|         // Сериализуем массив
 | |
|         $serialized = json_encode($array);
 | |
| 
 | |
|         // Записываем в ключ
 | |
|         $this->Write($key, $serialized);
 | |
|     }
 | |
| } |