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