Symfony 5.0.8 странная проблема при обновлении простого объекта - PullRequest
0 голосов
/ 03 мая 2020

Вот моя сущность:

<?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 )

Ожидаемый аргумент типа "string", "null", заданный в пути свойства "fname" .

При создании сущности @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');
    }
}

1 Ответ

0 голосов
/ 03 мая 2020

Это одна из причин, по которой вам следует избегать того, чтобы компонент формы изменял ваши сущности напрямую. Он установит данные, а затем подтвердит их. Поэтому после отправки формы сущность может оказаться в недопустимом состоянии.

В любом случае, вы можете указать, какое пустое значение должно быть:

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