forms - Symfony:处理请求时出现错误?
问题描述
这是一个任务实体对象(它的一部分):
class Mission {
/**
* @var \DateTime
*
* @ORM\Column(name="datedebmission", type="date", nullable=true)
*/
private $datedebmission;
/**
* @var \DateTime
*
* @ORM\Column(name="datefinmission", type="date", nullable=true)
*/
private $datefinmission;
function getDatedebmission(): \DateTime {
$date = $this->datedebmission;
if(is_null($date)) {
$date = new \DateTime();
$date->setTime(8, 0);
$this->datedebmission = $date;
}
return $date;
}
function getDatefinmission(): \DateTime {
$date = $this->datefinmission;
if(is_null($date)) {
$date = new \DateTime();
$date->setTime(12, 0);
$this->datefinmission = $date;
}
return $date;
}
function setDatedebmission(\DateTime $datedebmission) {
$this->datedebmission = $datedebmission;
}
function setDatefinmission(\DateTime $datefinmission) {
$this->datefinmission = $datefinmission;
}
}
在表单视图中,我想分开日期和时间。所以我在 Mission 类中添加了 4 个字段(当然没有关于数据库的注释)。他们来了 :
/**
*
* @Assert\NotBlank(
* message = "Cette valeur est obligatoire."
* )
*/
private $datedebmissiondate;
/**
*
* @Assert\NotBlank(
* message = "Cette valeur est obligatoire."
* )
*/
private $datedebmissiontime;
/**
*
* @Assert\NotBlank(
* message = "Cette valeur est obligatoire."
* )
*/
private $datefinmissiondate;
/**
*
* @Assert\NotBlank(
* message = "Cette valeur est obligatoire."
* )
*/
private $datefinmissiontime;
function getDatedebmissiondate() {
return $this->getDatedebmission();
}
function getDatedebmissiontime() {
return $this->getDatedebmission()->format('H:i');
}
function getDatefinmissiondate() {
return $this->getDatefinmission();
}
function getDatefinmissiontime() {
return $this->getDatefinmission()->format('H:i');
}
function setDatedebmissiondate(\DateTime $datedebmissiondate) {
$this->datedebmissiondate = $datedebmissiondate;
$this->setDatedebmission($datedebmissiondate);
}
function setDatedebmissiontime(String $datedebmissiontime) {
$datedebmission = $this->getDatedebmission();
$time = explode(':', $datedebmissiontime);
if(count($time) !== 2) {
throw new Exception('heure incorrect dans datedebmissiontime');
} else {
$this->datedebmissiontime = $datedebmissiontime;
$datedebmission->setTime($time[0], $time[1]);
$this->setDatedebmission($datedebmission);
}
}
function setDatefinmissiondate($datefinmissiondate) {
$this->datefinmissiondate = $datefinmissiondate;
}
function setDatefinmissiontime(String $datefinmissiontime) {
$datefinmission = $this->getDatefinmission();
$time = explode(':', $datefinmissiontime);
if(count($time) !== 2) {
throw new Exception('heure incorrect dans datefinmissiontime');
} else {
$this->datefinmissiontime = $datefinmissiontime;
$datefinmission->setTime($time[0], $time[1]);
$this->setDatefinmission($datefinmission);
}
}
现在我可以在 MissionType 类中添加使用我的新字段:
$builder->add('datedebmissiondate', DateType::class, array(
'label' => 'Date de début mission',
'widget' => 'single_text',
'format' => 'dd/MM/yyyy',
'attr' => array(
'no_results_text' => 'JJ/MM/AAAA'
)
));
$builder->add('datedebmissiontime', TextType::class, array(
'label' => 'Heure de début mission',
'attr' => array(
'placeholder' => 'Heure:Minutes'
)
));
$builder->add('datefinmissiondate', DateType::class, array(
'label' => 'Date de fin mission',
'widget' => 'single_text',
'format' => 'dd/MM/yyyy',
'attr' => array(
'no_results_text' => 'JJ/MM/AAAA'
)
));
$builder->add('datefinmissiontime', TextType::class, array(
'label' => 'Heure de fin mission',
'attr' => array(
'placeholder' => 'Heure:Minutes'
)
));
现在的树枝:
{{ form_row(form_mission.datedebmissiondate) }}
{{ form_row(form_mission.datefinmissiondate) }}
{{ form_row(form_mission.datedebmissiontime) }}
{{ form_row(form_mission.datefinmissiontime) }}
一切都像我期望的那样显示在日期和 datedebmissiontime 和 datefinmissiontime 中的 2 小时 08:00 和 12:00
提交表单,我在控制器中处理请求:
$form->handleRequest($request);
调试,我检查了请求:一切都在那里。
这个动作应该调用Request中不同参数的所有set方法。确实,调用了 set 方法..所有这些方法都是最后一个 datefinmissiontime。
结果是我的任务对象在 handlerequest 之后得到了:
$mission = $form->getData()
除了为 null 的 datefinmissiontime 字段之外的所有内容:我的表单无效。
返回视图,它会在datefinmissiontime
显示为 12:00 作为默认值的字段下显示错误消息。
重要提示:如果我更改值(例如 15:00),现在它可以工作并调用所有 set 方法。
handleRequest
如果我没有更改它,有人知道为什么在调用时不调用该字段的 set 方法吗?
解决方案
你setDatefinmissiondate
错过了重要的线路
$this->setDatefinmission($datefinmissiondate);
这就是为什么即使日期更改,基础日期时间也不会更改并保持不变的原因null
。
没有调用,因为如果值没有改变,setDetafinmissiontime
表单组件 AFAIK 不会调用设置器,从属性访问器(表单组件使用的)的角度来看,它没有。
添加“缺失”行应该可以解决问题。
推荐阅读
- ansible - Run previous task with when statement or rerun playbook based on condition
- tika-server - Apche Tika:如何将控制台日志保存到文件中。使用 log4j?
- r - Comparing base plot to ggplot returns an error
- javascript - Remove text collapse effect from sidebar
- swift - NSAttributedString 在 10.13 和 10.14+ 上绘制位置不同
- javascript - 修复悬停元素在居中文本中的位置
- elasticsearch - Is there a way to Elasticsearch diferentiate when a field does not exists vs when a field exists but is null ({})
- php - html表单已连接到mysql,但它没有提交任何数据,也没有创建空行
- python - How can I perform 3D array calculations efficiently?
- python - Tkinter - 如何扩展标签小部件?