如何正确验证表单中带有 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”?的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 - 验证不适用于嵌入式表单类型

如何在 symfony2 控制器中发送 JSON 响应

如何使用 symfony 4 创建登录验证表单

Symfony,在表单中预先提示/显示验证约束消息

在 symfony 2 中将验证组设置为嵌入表单

Symfony采用JSON数据和填充实体的推荐方法是什么?