gpt4 book ai didi

symfony - 在未映射的字段上添加自定义验证器,但具有整个表单提交的上下文?

转载 作者:行者123 更新时间:2023-12-04 14:58:41 25 4
gpt4 key购买 nike

tl;博士:

  • 我需要自定义验证约束才能在未映射的表单字段上运行
  • 我需要表单正在操作的对象的 ID,以将其排除在我的验证约束之外
  • 将验证附加到表单本身或未映射的字段并没有给我足够的上下文来运行我的验证查询


  • 我的 Person 上有一个未映射的字段我需要运行验证的实体表单。我已关注 this great article关于如何做到这一点,但我的用例略有不同,文章并未完全涵盖。

    我正在制作自己的唯一约束,需要运行自定义查询来确定唯一性。要运行查询,我需要访问提交的字段值以及原始 Person对象(所以我可以得到它的 ID,如果它是一个更新操作)。也没有那个 Person在唯一性查询期间,我将无法将其排除在考虑范围之外。

    如果我在 PersonType 上应用验证器类像这样:
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
    $resolver
    ->setDefaults(array(
    'data_class' => 'CS\AcmeBundle\Entity\Person',
    'constraints' => array(
    new MyUniqueValidator(),
    )
    ))
    ;
    }

    然后验证器通过了整个 Person对象来执行验证。这对我没有帮助,因为提交的表单数据没有持久化到 Person对象(这是我在 Controller 中调用 $form->isValid() 后处理的未映射字段)。

    如果我将验证器直接应用于未映射的字段:
        $builder
    ->add('myUnmappedField', 'text', array(
    'mapped' => false,
    'constraints' => array(
    new MyUniqueValidator(),
    )
    ),
    ))

    然后我传递给验证器的对象只是独立的表单文本,没有别的。我没有 ID Person对象(如果它是一个更新操作)通过唯一性查询来执行。

    希望我已经正确解释了这一点。我有什么选择可以优雅地进行这种验证吗?

    最佳答案

    你说你有未映射的字段。如果您将其映射到 Person 实体会有所帮助吗?只需使用 getter 和 setter 方法在 Person 类中创建一个新属性,但不要在 ORM 中创建一个新属性,因为您不希望它持久化。

    如果您不想污染您的 Person 类,您还可以创建另一个复合类,该类将保存您当前未映射的字段和一个 Person 对象(然后您将使其映射)。当然,然后您将设置 data_class 以匹配新对象的命名空间。

    上述两种解决方案都应该与您在那里拥有的上层代码一起使用。请让我知道它有帮助。

    关于symfony - 在未映射的字段上添加自定义验证器,但具有整个表单提交的上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23480514/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com