Open evgeek opened 2 years ago
Ломается, судя по всему, в JMS\Serializer\JsonDeserializationVisitor::visitString
, на массиве meta
Проблема в поле $value класса MoySklad\Entity\Attribute. Оно помечено как string, но МойСклад в нем может присылать в т.ч. и массив в случае, если в МоемСкладе используется дополнительное поле с типом "справочник".
В качестве решения можно зарегистрировать собственный тип mixed. Для этого нужно создать обработчик сериализации
namespace MoySklad\Util\Serializer;
class MixedSerializeHandler
{
/**
* @param $visitor
* @param mixed $value
* @param array $type
* @return array|mixed
*/
public function __invoke($visitor, $value, array $type)
{
return $value;
}
}
и десериализации
namespace MoySklad\Util\Serializer;
use JMS\Serializer\Serializer;
class MixedDeserializeHandler
{
/**
* @var Serializer
*/
private $serializer;
/**
* @param $visitor
* @param mixed $value
* @param array $type
* @return array|mixed
*/
public function __invoke($visitor, $value, array $type)
{
$this->serializer = SerializerInstance::getInstance();
return $this->serializer->deserialize(json_encode($value), gettype($value), 'json');
}
}
зарегистрировать новые обработчики в классе MoySklad\Util\Serializer\SerializerInstance
public static function getInstance(): Serializer
{
if (is_null(self::$instance)) {
self::$instance = SerializerBuilder::create()
->setPropertyNamingStrategy(
new SerializedNameAnnotationStrategy(
new IdenticalPropertyNamingStrategy()
)
)
->configureHandlers(
function (HandlerRegistry $registry) {
$registry->registerHandler(
self::DIRECTION['deserialization'],
MetaEntity::class,
'json',
new MetaEntityDeserializeHandler()
);
$registry->registerHandler(
self::DIRECTION['deserialization'],
Barcode::class,
'json',
new BarcodeDeserializeHandler()
);
$registry->registerHandler(
self::DIRECTION['deserialization'],
'mixed',
'json',
new MixedDeserializeHandler()
);
$registry->registerHandler(
self::DIRECTION['serialization'],
'mixed',
'json',
new MixedSerializeHandler()
);
}
)
->addDefaultHandlers()
->build();
}
return self::$instance;
}
и поменять тип у поля value в классе MoySklad\Entity\Attribute
/**
* @Type("mixed")
*/
public $value;
Буду очень признателен, если кто-нибудь оформит это в качестве pull request или предложит свое, более элегантное решение.
Добрый день. Наблюдаются проблемы с пакетом
jms/serializer
, а именно исключениеJMS\Serializer\Exception\NonStringCastableTypeException
: Cannot convert value of type "array" to string. При этом, ответ от Моего Склада приходит вполне себе корректный.Есть какие-то идеи, что с этим можно сделать?
Stacktrace: