Как правильно проверить тип доктрины "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, это необходимо проверить. Вам, вероятно, следует просто сохранить его как (ДЛИННЫЙ) ТЕКСТ.

Другие вопросы по тегам