php_components_pack/sources/traits/JsonReWriter/JsonReWriterWriteTrait.php
2025-06-29 20:29:52 +03:00

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);
}
}