【问题标题】:Forcing Symfony form validation without actual submission在没有实际提交的情况下强制 Symfony 表单验证
【发布时间】:2015-12-29 08:58:55
【问题描述】:

是否可以手动、强制执行表单字段验证?

我有一个表格。它具有全局表单验证。如果用户提交数据,一切都会正常运行。

但我想在向用户显示表单之前触发验证 - 在提交之前显示错误。

尝试使用$form->submit([]) 方法提交,但未触发表单字段验证。

对这个问题有什么想法吗?我有什么问题吗?

【问题讨论】:

  • 表单在提交之前怎么可能有错误?!
  • @DonCallisto - 我用来自外部服务的数据填写表格。此外 - 我想向用户显示 form 错误(其中包含需要映射哪些字段的说明)。
  • 考虑使用 js 字段验证器方法。已经有一些捆绑包可以做到这一点,例如github.com/formapro/JsFormValidatorBundle
  • @Matteo - 没有任何简单的解决方案可以再次触发验证吗?这么简单的任务真的需要单独的捆绑包吗?

标签: symfony symfony-forms


【解决方案1】:

您是否需要仅通过表单验证数据?验证器服务不适合您吗?

喜欢

$violations = $this->get('validator')->validate($entity);

【讨论】:

  • 如果您想将违规映射到表单...在验证实体后似乎没有简单的方法可以做到这一点,因为 ViolationMapper 正在寻找前缀为“children”的 PropertyPaths 实体验证不起作用。
  • 验证器服务不适合您吗? 不,因为表单约束未映射到实体...
【解决方案2】:

原因既复杂又简单。

// form instantiation

$type = new MyType();

$options = [
    'csrf_protection'=>!empty($_POST[$type->getName()])
];

$form = $this->createForm($type, [/* or entity */], $options);
$form->handleRequest($request);

if(!$form->isSubmitted()){
    $form->submit([]);
}

现在我可以正确地看到错误了。最棘手的部分之一是我不知道表单 $options 在创建后是只读的,如果您想打开 CSRF 保护,则必须检查 empty

【讨论】:

    【解决方案3】:

    在显示表单之前调用$form->isValid();

    但是如果数据来自外部服务,我宁愿防止(例如使用ws验证)用户通过ws提交错误的数据(ws =外部服务)

    【讨论】:

    • isValid 仅调用收集 errors 受保护的属性。它在 submit 函数期间填充,但唯一可用的检查是 CSRF 令牌验证...
    • 所以我不确定我是否理解您的需求
    • 我已经使用setData 方法设置了一些数据。我想对这些数据执行验证,然后 - 使用标准表单错误视图显示最终用户验证结果,就像用户单击“提交”按钮一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 2015-10-01
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    相关资源
    最近更新 更多