如何在 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 查询编写单元测试
如何使用 LoginFormAuthenticator 和 Login Link Authenticator 在 Symfony 5.2 中为特定路径设置默认身份验证器