Как правильно проверить тип доктрины "json" с ограничением json symfony в форме?
Итак, я хотел бы ввести некоторый json в форму, чтобы он был проверен ограничением json symfonys:
/**
* @Assert\Json(
* message = "variantJson field: invalid Json."
* )
* @ORM\Column(type="json", nullable=true)
*/
private $variantJson = [];
Форма выглядит примерно так:
$builder
...
->add('variantJson', null, ['attr' => $style])
->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
...
}
})
;
$builder->get('variantJson')
->addModelTransformer(new CallbackTransformer(
function ($jsonToString) {
// transform the array to a string
return json_encode($jsonToString);
},
function ($stringToJson) {
// transform the string back to an array
dump(json_decode($stringToJson, true));
dump(json_last_error());
//1
return $stringToJson;
//2
return json_decode($stringToJson, true);
}
))
;
Основная проблема заключается в том, что когда я пытаюсь вернуть только строку json в ModelTransformer, я получаю следующее исключение:
Ожидаемый аргумент типа "массив или ноль", "строка" задан в пути свойства "variantJson".
В "PropertyAccessor"
И когда я хочу вернуться в виде массива, я выполняю json_decode и получаю другую ошибку:
Ожидаемый аргумент типа "строка", "массив" задан
В "JsonValidator".
Я подозреваю, что и PropertyAccessor, и JsonValidator работают последовательно, и им нужны разные типы. Я, должно быть, что-то упускаю. Любые идеи? Заранее спасибо!
1 ответ
Тип Doctrine JSON действительно ожидает массив:https://www.doctrine-project.org/projects/doctrine-dbal/en/2.10/reference/types.html
Это полезно, если вам нужен массив в вашем коде и вы хотите сохранить эти данные в базе данных. Данные преобразуются в строку JSON перед сохранением и обратно в массив при извлечении.
Если вам не нужен массив в вашем PHP-коде, и ваш конечный пользователь каким-то образом отправляет JSON, это необходимо проверить. Вам, вероятно, следует просто сохранить его как (ДЛИННЫЙ) ТЕКСТ.