1
0
mirror of synced 2024-12-04 11:16:08 +03:00
bitrix-module/intaro.retailcrm/lib/component/json/serializer.php
Neur0toxine 5f69051859
Программа лояльности
* New module structure (refactoring)
* Simple serializer and deserializer with models, new architecture
* Move logic to strategies
* Partial api client facade implementation (full implementation is not necessary for now)
* Loyalty feature installer
* Sms verification order (#167)
* Make updater self-sufficient
* Fix for order submit & fix for incorrect component rendering in the constructor
* Fix for loyalty personal area error handling
* Fix for cart component identity
* Fix for softlock when customer cannot be registered in loyalty

Co-authored-by: Сергей Чазов <45812598+Chazovs@users.noreply.github.com>
Co-authored-by: Sergey Chazov <oitv18@gmail.com>
2021-11-16 10:48:26 +03:00

96 lines
2.4 KiB
PHP

<?php
/**
* PHP version 7.1
*
* @category Integration
* @package Intaro\RetailCrm\Component\Json
* @author RetailCRM <integration@retailcrm.ru>
* @license MIT
* @link http://retailcrm.ru
* @see http://retailcrm.ru/docs
*/
namespace Intaro\RetailCrm\Component\Json;
use Intaro\RetailCrm\Component\Json\Mapping\PostSerialize;
use Intaro\RetailCrm\Component\Json\Strategy\AnnotationReaderTrait;
use Intaro\RetailCrm\Component\Json\Strategy\StrategyFactory;
use RetailCrm\Exception\InvalidJsonException;
/**
* Class Serializer
*
* @package Intaro\RetailCrm\Component\Json
*/
class Serializer
{
use AnnotationReaderTrait;
/**
* @param mixed $object
* @param string $type
*
* @return string
* @throws \ReflectionException
*/
public static function serialize($object, string $type = ''): string
{
$result = json_encode(static::serializeArray($object, $type));
if (json_last_error() !== JSON_ERROR_NONE) {
throw new InvalidJsonException(json_last_error_msg(), json_last_error());
}
return (string) $result;
}
/**
* @param mixed $object
* @param string $type
*
* @return array
* @throws \ReflectionException
*/
public static function serializeArray($object, string $type = ''): array
{
$type = empty($type) ? gettype($object) : $type;
$result = (array) StrategyFactory::serializeStrategyByType($type)->serialize($object);
return static::processPostSerialize($object, $result);
}
/**
* Process post deserialize callback
*
* @param object $object
* @param array $result
*
* @return array
* @throws \ReflectionException
*/
private static function processPostSerialize($object, array $result): array
{
$class = get_class($object);
if ($object) {
try {
$reflection = new \ReflectionClass($class);
} catch (\ReflectionException $e) {
return $result;
}
foreach ($reflection->getMethods() as $method) {
$postDeserialize = static::annotationReader()
->getMethodAnnotation($method, PostSerialize::class);
if ($postDeserialize instanceof PostSerialize) {
return $method->invokeArgs($object, [$result]);
}
}
}
return $result;
}
}