首页 > 解决方案 > Symfony 5.0.8 更新简单实体时出现奇怪问题

问题描述

这是我的实体:

<?php

namespace App\Entity\Contact;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Entity
 * @ORM\Table(name="contact_contact")
 */
class Contact
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer", options={"unsigned":true})
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @Assert\NotBlank
     * @ORM\Column(type="string", length=40, nullable=true)
     */
    private $fname;

    /**
     * @ORM\Column(type="string", length=40, nullable=true)
     */
    private $lname;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getFname(): ?string
    {
        return $this->fname;
    }

    public function setFname(string $fname): self
    {
        $this->fname = $fname;

        return $this;
    }

    public function getLname(): ?string
    {
        return $this->lname;
    }

    public function setLname(?string $lname): self
    {
        $this->lname = $lname;

        return $this;
    }

}

这是编辑控制器操作代码:

/**
 * @Route("/{id}/edit", name="contact_contact_edit", methods={"GET","POST"})
 */
public function edit(Request $request, Contact $contact): Response
{
    $form = $this->createForm(ContactType::class, $contact);
    $form->handleRequest($request);

    if ($form->isSubmitted()) {
            if ($form->isValid()) {
                $this->getDoctrine()->getManager()->flush();
            }
    }

    return $this->render('contact/contact/edit.html.twig', [
        'contact' => $contact,
        'form' => $form->createView(),
    ]);
}

当我发布表单但将 fname(名字)字段留空时...我收到此错误(Symfony\Component\PropertyAccess\Exception\InvalidArgumentException

属性路径“fname”中给出的“string”类型的预期参数,“null”。

创建实体时,@Assert 会按预期工作,并且消息是这样说的……但是如果我将其留空并更新帖子……bzzzt 错误。

我错过了什么?

编辑 | 这是表单类以防万一那在做什么?

<?php

namespace App\Form\Contact;

use App\Entity\Contact\Contact;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class ContactType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('fname', TextType::class, ['label' => 'First Name'])
            ->add('lname', TextType::class, ['label' => 'Last Name']);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Contact::class,
            'min_entry' => false,

            // NOTE: Must be added to every form class to disable HTML5 validation
            'attr' => ['novalidate' => 'novalidate']
        ]);

        $resolver->setAllowedTypes('min_entry', 'bool');
    }
}

标签: symfonysymfony4symfony-forms

解决方案


这就是您应该避免允许表单组件直接更改您的实体的原因之一。它将设置数据,然后验证它。因此,提交表单后,实体完全有可能处于无效状态。

无论如何,您可以指定空值应该是什么:

->add('fname', TextType::class, ['label' => 'First Name', 'empty_data' => ''])

推荐阅读