Symfony DateTimeType表单功能测试提交问题及解决方案分享
解决Symfony DateTimeType拆分字段的功能测试提交问题
最近在Symfony项目里用DateTimeType做了一个拆分日期和时间的表单字段,前端渲染完全正常,但跑功能测试的时候提交表单总是出问题,折腾了一会儿终于找到解决办法,分享给遇到同样问题的朋友。
我的表单配置
首先是表单构建的代码,我把日期和时间分别用单文本框展示:
public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('datetime', DateTimeType::class, [ 'date_widget' => 'single_text', 'date_format' => 'dd/MM/yyyy', 'time_widget' => 'single_text', ]); }
这段代码会生成两个独立的input元素,name属性分别是form[datetime][date]和form[datetime][time]:
<input type="text" id="form_datetime_date" name="form[datetime][date]"> <input type="text" id="form_datetime_time" name="form[datetime][time]">
测试时踩的坑
一开始我尝试了两种写法都没法正确提交:
第一种直接访问datetime字段,结果根本取不到对应的输入框:
$form = $crawler->selectButton('my_submit')->form(); $form['form']['datetime']; // 无效,因为字段已经拆分成date和time两个独立输入
第二种尝试通过嵌套数组访问,但传了DateTime对象,同样不行:
$form = $crawler->selectButton('my_submit')->form(); $form['form']['datetime']['date'] = new \DateTime('tomorrow'); $form['form']['datetime']['time'] = new \DateTime('tomorrow'); // 无法正确解析成表单文本值
正确的解决方案
核心要点有两个:
- 直接使用input的完整
name属性作为表单字段的键 - 传入符合格式要求的字符串,而不是
DateTime对象
正确的测试代码如下:
$form = $crawler->selectButton('my_submit')->form(); // 日期要匹配配置里的dd/MM/yyyy格式,用d/m/Y格式化字符串 $form['form[datetime][date]'] = (new \DateTime('tomorrow'))->format('d/m/Y'); // 时间字段根据需求传对应的文本格式,比如24小时制的H:i $form['form[datetime][time]'] = '14:30'; // 提交表单 $client->submit($form);
原因很简单:当DateTimeType拆分成两个文本框后,它们在表单里是独立的输入项,测试框架需要通过完整的name属性来定位;另外前端是文本输入,所以必须传字符串,框架不会自动把DateTime对象转换成对应的格式字符串。
内容的提问来源于stack exchange,提问作者goto
相关产品推荐
相关产品推荐

