Symfony 4. *在控制器中设置字段值并防止validatinon错误:此值不应为null

时间:2019-04-21 08:00:27

标签: symfony symfony-forms symfony4

我正在使用Symfony 4.2.3.,我有一个名为Article的实体,该实体除其他外包括以下字段:

  • 版本
  • versionUserId
  • versionTimestamp

具有* @Assert\NotNull验证标记的

我想在控制器中手动设置这些字段的值,例如使用:

$article->setVersionUserId($user);
                $article->setVersionTimestamp(new \DateTime());
                $article->setVersion(1);

但是,据我了解,$form->isValid()是验证对象而不是表单。因此,为了防止This value should not be null.验证错误,我必须在验证表单之前设置这些字段的值。如何实现这一目标?


我的控制器:

  public function article_edit($action, Request $request)
        {
    $form = $this->createForm(ArticleType::class);  

        // Customize the form
        $form->remove("versionTimestamp");
        $form->remove("versionUserId");
        $form->remove("version");
        $form->add('save', SubmitType::class, ['label' => 'Zapisz']);

        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
        $article = $form->getData();
            /*
                $article->setVersionUserId($user);
                $article->setVersionTimestamp(new \DateTime());
                $article->setVersion(1);
            */
/.../

2 个答案:

答案 0 :(得分:2)

正如Omar Makled所说,validation groups是实现这一目标的一种方法。 TBH,我希望采用其他方法:

$article = new Article();
$article->setVersionUserId($user);
$article->setVersionTimestamp(new \DateTime());
$article->setVersion(1);

$form = $this->createForm(ArticleType::class, $article); // <- preset
$form->add('save', SubmitType::class, ['label' => 'Zapisz']);

if ($form->isSubmitted() && $form->isValid()) {
    $article = $form->getData();
    // do other stuff...
}

(注意:当您分配用户名时,调用字段“ userId”很奇怪,但这只是我)

答案 1 :(得分:0)

我认为preSubmit事件是实现您想要的https://symfony.com/doc/current/form/events.html

的最佳方法