如何在 Symfony 中为 TimeType 添加约束

Posted

技术标签:

【中文标题】如何在 Symfony 中为 TimeType 添加约束【英文标题】:How to add constraints to TimeType in Symfony 【发布时间】:2021-11-16 23:10:25 【问题描述】:

我有一个构建器,它为我创建了一个带有小时和分钟选项的选择:

$builder->add("startTime", 'Symfony\Component\Form\Extension\Core\Type\TimeType', [
            "required" => true,
            "attr" => [
                "class" => "da_start",
                "id" => "da_start",
                "name" => "da_start"
            ],
            "data" => new \DateTime($start),
            "empty_data" => 'default',
            "label_attr" => [
                "class" => "da_start_label",
            ],
            "minutes" => $options['minutes'],
            "hours" => $start_hours_range,
            "constraints" => [
                new LessThanOrEqual([
                    "value" => $startCheck,
                    "message" => "1-2"
                ])
            ]
        ]);

在里面我有一个约束数组,我想验证这个字段,这样如果输入的值大于 $startCheck 变量,就会显示错误消息。

$startCheck 变量是这样生成的:

$startCheck = new \DateTime('today' . $options['lessThan']);

并表示以下日期时间对象:

DateTime #1056 ▼
  +"date": "2021-09-23 06:30:00.000000"
  +"timezone_type": 3
  +"timezone": "Europe/Berlin"

这意味着如果我在表单中输入 06:45,则验证不应该通过。 这是我从表单中获得的值的转储:

DateTime #52 ▼
  +"date": "2021-09-23 06:45:00.000000"
  +"timezone_type": 3
  +"timezone": "Europe/Berlin"

并且这个值很好地传递并被写入数据库。我在这里做错了什么?

【问题讨论】:

【参考方案1】:

好吧,事实证明 Symfony 生成的不是今天的日期对象,而是 1970-01-01(Unix 纪元开始)的日期对象。

这就是为什么 $startCheck 变量应该被初始化为:

$startCheck = new \DateTime('1970-01-01T' . $options['lessThan']);

有点脏,但这种比较适合。

【讨论】:

以上是关于如何在 Symfony 中为 TimeType 添加约束的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Symfony 中为使用 queryBuilder 构建的 MongoDB 查询编写单元测试

如何在 Symfony 2 中为数据库视图设置实体(原则)

如何在 Angular 4 中为表格添加分页?

如何在python中为GET请求添加轮询间隔

如何使用 LoginFormAuthenticator 和 Login Link Authenticator 在 Symfony 5.2 中为特定路径设置默认身份验证器

Symfony 4:如何在防火墙中为用户/管理员提供多个提供者?