首页 > 解决方案 > 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 方法吗?

标签: formssymfony

解决方案


setDatefinmissiondate错过了重要的线路

$this->setDatefinmission($datefinmissiondate);

这就是为什么即使日期更改,基础日期时间也不会更改并保持不变的原因null

没有调用,因为如果值没有改变,setDetafinmissiontime表单组件 AFAIK 不会调用设置器,从属性访问器(表单组件使用的)的角度来看,它没有。

添加“缺失”行应该可以解决问题。


推荐阅读