如何正确验证表单中带有 symfony json 约束的学说类型“json”?
Posted
技术标签:
【中文标题】如何正确验证表单中带有 symfony json 约束的学说类型“json”?【英文标题】:How to validate doctrine type "json" with symfony json constraint in a form correctly? 【发布时间】:2020-08-26 10:41:08 【问题描述】:所以,我想在表单中输入一些 json,以便通过 symfonys json 约束对其进行验证:
/**
* @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);
))
;
主要问题是,当我尝试只在 ModelTransformer 中返回 json 字符串时,我得到了这个异常:
在属性中给出的“数组或空”、“字符串”类型的预期参数 路径“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
如果您需要在代码中使用数组并希望将该数据保存在数据库中,这将非常有用。数据在保存之前转换为 JSON 字符串,并在检索时返回到数组。
如果您的 php 代码中不需要该数组,并且您的最终用户以某种方式提交需要验证的 JSON。您可能应该将其保存为(长)文本。
【讨论】:
但我需要 PHP 中的数组。我是否应该尝试自己验证它并将其作为数组返回,然后在 ModelTransformer 中?我只是不明白为什么 symfony json 约束与 json 教义属性不兼容,他们一定有不同的想法...... (通过验证自己,我的意思是使用验证器) 嗯,这是两个不同的东西,验证器纯粹是为了验证 JSON 字符串,与保存或转换无关。 Doctrine JSON 类型用于在数据库中保存“数组”,它通过将其转换为 JSON 来实现。您必须选择最适合您的组合。如果 JSON 由用户提供并且可能有问题,您可能应该坚持使用验证 + TEXT 字段,并在需要时将其转换为数组。以上是关于如何正确验证表单中带有 symfony json 约束的学说类型“json”?的主要内容,如果未能解决你的问题,请参考以下文章