Symfony2 形成没有实体的验证器组

2024-03-12

我正在使用 Symfony2 表单组件来构建和验证表单。现在我需要根据单个字段值设置验证器组,不幸的是,似乎每个示例都基于实体 - 由于多种原因,我没有使用实体。

例子: 如果任务为空,则应删除所有约束验证器,但如果不是,则应使用默认的验证器集(或验证器组)。

换句话说,我想要实现的目标是使子表单成为可选的,但如果填充了关键字段,则仍然会进行验证。

有人可以给我一个如何配置它的例子吗?

<?php
namespace CoreBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Validator\Constraints as Assert;
use CoreBundle\Form\Type\ItemGroupOption;

class ItemGroup extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('title', 'text', array(
            'label' => 'Titel',
            'attr' => array('class' => 'span10 option_rename'),
            'required' => false
        ));
        $builder->add('max_selections', 'integer', array(
            'label' => 'Max tilvalg',
            'constraints' => array(new Assert\Type('int', array('groups' => array('TitleProvided')))),
            'attr' => array('data-default' => 0)
        ));
        $builder->add('allow_multiple', 'choice', array(
            'label' => 'Tillad flere valg',
            'constraints' => array(new Assert\Choice(array(0,1))),
            'choices'  => array(0 => 'Nej', 1 => 'Ja')
        ));
        $builder->add('enable_price', 'choice', array(
            'label' => 'Benyt pris',
            'constraints' => array(new Assert\Choice(array(0,1))),
            'choices'  => array(0 => 'Nej', 1 => 'Ja'),
            'attr' => array('class' => 'option_price')
        ));
        $builder->add('required', 'choice', array(
            'label' => 'Valg påkrævet',
            'constraints' => array(new Assert\Choice(array(0,1))),
            'choices'  => array(0 => 'Nej', 1 => 'Ja')
        ));
        $builder->add('options', 'collection', array(
            'type' => new ItemGroupOption(),
            'allow_add' => true,
            'allow_delete' => true,
            'by_reference' => false
            )
        );
        $builder->add('sort', 'hidden');
    }

    public function getName()
    {
        return 'item_group';
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        global $app;

        $resolver->setDefaults(array(
            'validation_groups' => function(FormInterface $form) use ($app) {

                // Get submitted data
                $data = $form->getData();

                if (count($app['validator']->validateValue($data['title'], new Assert\NotBlank())) == 0) {
                    return array('TitleProvided');
                } else {
                    return false;
                }
            },
        ));
    }
}

如果您使用的是 2.1,您可能想看看“根据提交的数据进行分组” http://symfony.com/doc/current/book/forms.html#groups-based-on-submitted-data.

Update

使用演示联系页面的示例/demo/contact在默认情况下AcmeDemoBundleSymfony 标准版提供:

具有条件验证组的表单类型:

namespace Acme\DemoBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Validator\Constraints as Assert;

class ContactType extends AbstractType
{
    // Inject the validator so we can use it in the closure
    /**
     * @var Validator
     */
    private $validator;

    /**
     * @param Validator $validator
     */
    public function __construct(Validator $validator)
    {
        $this->validator = $validator;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('email', 'email');
        $builder->add('message', 'textarea', array(
            // Added a constraint that will be applied if an email is provided
            'constraints' => new Assert\NotBlank(array('groups' => array('EmailProvided'))),
        ));
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        // This is needed as the closure doesn't have access to $this
        $validator = $this->validator;

        $resolver->setDefaults(array(
            'validation_groups' => function(FormInterface $form) use ($validator) {
                // Get submitted data
                $data = $form->getData();
                $email = $data['email'];

                // If email field is filled it will not be blank
                // Then we add a validation group so we can also check message field
                if (count($validator->validateValue($email, new Assert\NotBlank())) == 0) {
                    return array('EmailProvided');
                }
            },
        ));
    }

    public function getName()
    {
        return 'contact';
    }
}

不要忘记注入validator服务形式类型:

<?php

namespace Acme\DemoBundle\Controller;

//...

class DemoController extends Controller
{
    // ...

    public function contactAction()
    {
        $form = $this->get('form.factory')->create(new ContactType($this->get('validator')));

        // ...
    }
}

正如您所看到的验证message仅当以下情况时才会触发字段email字段已满。

使用 diff 工具来捕捉差异。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Symfony2 形成没有实体的验证器组 的相关文章

  • PHP 和 DOM 文档

    我有一个关于 DOMDocument 的使用和创建 XML 的问题 我有一个 PHP 程序 加载到 XML 文件中 处理XML的每个节点 行 将其发送到另一个进程 然后该进程返回一个 XML 元素 我获取节点的字符串表示形式 以便可以创建
  • php 或 zend 中国际电话号码验证的正则表达式是什么?

    我有一个 zend 表单 其中有一个电话号码字段 并且必须检查验证器 我决定为此使用正则表达式 我搜索了谷歌 但我得到的结果不起作用 谁能给我提供正则表达式 这是我的代码 phone new Zend Form Element Text p
  • 当用户再次访问同一页面时保持登录状态?

    目前我正在使用会话来登录用户 但是当我关闭浏览器并再次打开它时 我必须再次登录 你如何让用户在 2 周内保持登录状态 那么是通过cookie吗 那么您想要 在这台计算机上记住我 选项吗 这是一种与语言无关的方法 创建一个至少包含以下内容的数
  • 由于重复捕获组而不是捕获重复组,正则表达式不匹配

    我有以下正则表达式 A G A G 具有以下表达式 A BsCb 我期望 3 个匹配结果 A Bs Cb 但测试在https regex101 com https regex101 com 只给我最后一场比赛Cb 并告诉我重复捕获组只会捕获
  • 有没有办法在不使用 foreach 或其他函数的情况下在 PHP 中内爆关联数组的键和值?

    我有一个像这样的关联数组 myarray array a gt 1 b gt 2 c gt 3 我想显示数组键和值 如下所示 a is 1 b is 2 c is 3 我不想使用 print r 或 var dump 来执行此操作 我也不想
  • 未找到“MongoId”类(带有 MongoDB Doctrine 的 Zend 框架)

    我目前正在尝试将 MongoDB 与 ZendFramework 中的 Doctrine 集成 我做了很多教程 在 StackOverflow 或其他地方 但没有任何效果 我一步步按照教程进行操作 http www bigwisu com
  • 如何使用 PHP 查找目录中的前 5 个文件?

    如何使用 PHP 列出按字母顺序排序的目录中的前 5 个文件或目录 Using scandir array slice array filter scandir path to dir is file 0 5 The array filte
  • PHP语言问题

    我有一个 php 页面 它将邮件发送到特定电子邮件 其中包含此页面表单中的数据 邮件必须以网站的母语 阿拉伯语 发送 但是当我单击表单上的提交按钮时 收到的邮件一半可读 阿拉伯语 另一部分不可读 符号 我想知道如何解决这个问题并且能够发送邮
  • Symfony 学说错误“DoctrineMigrationsBundle 需要启用 DoctrineBundle。”

    我创建了一个新的 Symfony 项目 并且不断收到此消息 DoctrineMigrationsBundle 需要启用 DoctrineBundle 错误并且无法摆脱它 显然我是这个星球上唯一一个收到此错误的人 因为谷歌并没有太大帮助 在
  • json_encode 创建格式错误的 JSON 数据?

    我有一个 codeigniter 应用程序将一些数据从数据库返回到视图 我正在尝试将其作为 json 数据发送回来 问题是返回的数据格式错误 它看起来像这样 2 5 Admin1 2 10 Admin2 当我在 jsonlint com 上
  • 正则表达式替换混合数字+字符串

    我想删除所有包含数字的单词 示例 LW23 London W98 String 从上面的字符串中我唯一想保留的是 London String 这可以用正则表达式来完成吗 我目前正在使用 Python 但 PHP 代码也很好 Thanks E
  • 如何在 Laravel Mix 中将公共路径更改为包含下划线的路径?

    Laravel 5 4 中引入了 Mix 来编译资产并维护资产管道 Mix 默认为您的公共目录被命名public 在许多情况下 包括我的 我的公共目录被称为其他名称 就我而言 是public html 如何更改资源编译到的公共目录 我尝试过
  • requestValidationMode 2.0 和 4.0 有什么区别

    这是 MSDN 的定义 4 0 默认值 HttpRequest 对象在内部设置一个标志 指示每当访问任何 HTTP 请求数据时都应触发请求验证 这保证了在请求期间访问 cookie 和 URL 等数据之前触发请求验证 配置文件中的页面元素
  • 动态创建类 - Python

    我需要动态创建一个类 为了更详细地讲 我需要动态创建 Django 的子类Form class 通过 动态 我打算根据用户提供的配置创建一个类 e g 我想要一个名为CommentForm这应该子类化Form class 该类应该有一个选定
  • 验证美国的电话号码是否存在

    我想用 C 验证美国的给定电话号码 是否有任何API或其他东西可以帮助程序员验证电话号码存在 我不仅想验证它们是否与美国电话号码的格式匹配 还想验证它们的存在 提前致谢 您可以使用正则表达式验证电话号码格式 例如 但为了验证该电话号码是否确
  • 计算轮班工作时间并检测

    我有个问题 我的英语很差 我需要用PHP做一个加班计算 已经有一个代码可以实现这一点 但当工作时间超过2天时 计算就会出错 工作开始 2018 09 09 13 43 工作结束 2018 09 11 07 13 结果 07 18 04 00
  • 如何使用额外标记输出 wp_list_categories

    我目前正在使用下面的脚本在无序列表中输出我的所有 WordPress 类别 如何获得带有额外标记的输出 ul ul 例如 ul li Category 1 rsaquo li li Category 2 rsaquo li ul 代替 ul
  • 在 Windows 上查看 PHP 文件夹

    我正在编写一个简单的 PHP 脚本来监视文件夹及其子文件夹的任何更改 新文件 修改 删除 然后执行操作 我将使用 Windows 上的命令行运行此脚本php f script php 我一直在寻找一种在 Windows 上观看具有 PHP
  • 使用 PHP 创建图表并导出为 PDF

    我正在寻找有关使用 PHP 创建图表的建议 我还希望能够将这些图表导出到 PDF 文档 我目前正在使用谷歌图表 但我不喜欢将我的所有信息发送到谷歌的想法 我更喜欢自己的托管解决方案 我见过很多 Flash 解决方案 但我不知道有什么方法可以
  • PHP 用星号替换所有字符

    假设我有一个字符串形式的密码 password thisisaplaintextpassword 我怎样才能把它变成下面的样子 password 我想通过电子邮件向用户发送他们的帐户详细信息 但不想发送整个内容 Use 字符串重复 http

随机推荐

  • Activity 已泄漏窗口

    在我的启动屏幕中 我做了它 以便它检测 wifi 或 3g 是否启用 如果不是 则会出现一个对话框屏幕提示用户退出并打开其中一个 如果它打开 则代码将继续 我的 logcat 中不断收到有关我的活动有泄漏窗口的错误 我不知道如何解决这个问题
  • 如何检测访问您网站的用户所在的国家和城市?

    如何检测访问您网站的用户的原籍国 我在我的网站上使用 Google Analytics 分析 可以看到我的用户来自世界不同地区 但在我的应用程序中 我想根据国家 地区甚至城市提供一些额外的定制 是否可以从浏览器中检测到此信息 这是一个 Py
  • 如何在 Steam WebAPI 中获取应用程序的价格?

    是否可以通过 WebAPI 从 Steam 获取游戏的价格 目前 我们有 API 调用 这意味着我们可以使用JSON http php net manual en book json php for it Appid 57690 海岛大亨
  • Java 日期格式到 JavaScript 日期格式

    我希望能够转换 Java 日期格式字符串 例如日 月 年 07 06 2009 转换为 JavaScript 日期格式字符串 例如dd mm yy 2009 年 7 月 6 日 有没有人以前做过这个 或者知道我在哪里可以找到一些已经做到这一
  • 如何以轻松的方式实现身份验证?

    我正在使用 python 在网络应用程序谷歌应用程序引擎上构建图片日记 用户可以注册并将照片发布到他们的日记中 另外 我正在尝试尽可能地遵循 REST 架构 Web 应用程序的身份验证方案基于以下形式 1 从前端发布用户名 密码2 认证成功
  • 如何向水晶报表中的子报表发送参数

    使用VS 2008 我有两个存储过程 一个用于获取主报告的数据 另一个用于获取子报告的数据 并且两个 SP 使用相同的参数 QuoteID 我已使用 ReportDocument 将参数发送到主报告 但我不知道如何向子报表发送参数 我使用报
  • 无法将序列乘以“float”类型的非 int 错误?

    我正在尝试做一个简单的计算 稍后将在数组上完成 并得到上述错误 无法将序列乘以 float 类型的非 int 8 99 math log 1 0 5 1 2 87 方括号将结果转为 math log 1 0 5 1 2 87 到具有单个元素
  • 如何让 Google Compute Engine 服务器休眠?

    我想使用 GCE 服务器和 VNC 来运行我编写的一些桌面程序 但是 我不想让 GCE 服务器一直运行 以节省金钱 并且我希望保留 VNC 桌面的设置 以节省时间 完成此任务的最简单方法似乎是以某种方式休眠 GCE 实例 有没有办法从脚本或
  • Java 中的包和 C++ 中的库之间有区别吗?

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 有没有办法配置 PuTTY 或其他终端以在下一个输出到 stdout 时闪烁任务栏?

    我专门寻找 PuTTY 的解决方案 但也对其他终端模拟器感兴趣 例如 Gnome Terminal 我的想法是 如果我开始一个tar zxvf为了能够在终端模拟器上设置触发器 将其最小化 然后在下一次输出到 stdout stderr 时
  • 检查 Flask 中 Jinja2 内的变量类型

    我创建的模板文件包含以下内容 if type a 1 b 2 is dict print Oh Yes else print Oh No endif 然后 Jinja2 回应说 TemplateAssertionError no test
  • 是否可以使用Go编译器为其他操作系统分发可执行文件?

    我目前正在Mac OS X上工作 现在我需要构建一个 exe文件 以便Go程序可以在Windows上运行 那么问题来了 如何在 MacOS amd64 下构建 Win X86 的可执行文件 或者不可能这样做吗 如果你不使用 CGo 而使用纯
  • 使用或不使用 C++0x 功能 [重复]

    这个问题在这里已经有答案了 可能的重复 您今天使用 C 0x 的情况如何 https stackoverflow com questions 1754397 how are you using c0x today 我正在与一个团队合作开发一
  • Websocket Java 服务器。不发送消息也不接收消息

    我正在尝试制作一个 Java WebSocket 服务器 没有什么真正复杂的 只是一个丑陋的小服务器 用于使用标准定义的 api 从浏览器尝试 websocket 我一直在阅读协议的规范 它非常简单 我已经握手了 显然它正在起作用 我用Ja
  • 附加分配给特定分区的 KafaConsumer

    如何将 python 消费者脚本附加到特定的 kafka 分区 在运行消费者脚本的两个实例 如下所示 时 每个实例都会随机选择一个分区 然后按预期消费 打印该特定分区的所有消息 但由于我需要将这些消息输出到磁盘上名为本地文件的分区 因此将脚
  • 用于存储数百万张图像的文件夹结构?

    我正在构建一个网站 该网站正在查看轻松上传的数百万张照片 每个上传的图像都有 3 个缩略图 我需要找到存储所有这些图像的最佳方法 我搜索并找到了存储为哈希的图像示例 例如 如果我上传 coolparty jpg 我的脚本会将其转换为 Md5
  • 数据仓库模型:集线器有什么用?

    我刚刚读到数据仓库建模 https en wikipedia org wiki Data vault modeling据我了解 集线器仅包含密钥 和记录源 所以我想知道为什么我应该创建这些中心表 只是为了存储记录源 仅拥有卫星和链接还不够吗
  • NSValueTranformer 用于加密数据

    我想在 NSValueTransformer 的帮助下加密一些核心数据列 我的想法是 我使用数据类型可转换并为我的数据类型定义一些转换器 在转换方法中 我想加密 解密该值 我定义了一个实际上什么都不做的变压器 加密的东西目前还没有实现 im
  • ReportViewer 到 div/image/object 内的 PDF

    这几天一直在寻找 但没能找到我要找的东西 希望我没有错过 我有一个 ASP NET 4 0 站点 我正在将其放在一起以检索工资信息 目前我正在使用reportviewer 但由于跨浏览器支持 它不能100 工作 我已经将其设置为自动将 RV
  • Symfony2 形成没有实体的验证器组

    我正在使用 Symfony2 表单组件来构建和验证表单 现在我需要根据单个字段值设置验证器组 不幸的是 似乎每个示例都基于实体 由于多种原因 我没有使用实体 例子 如果任务为空 则应删除所有约束验证器 但如果不是 则应使用默认的验证器集 或