symfony - 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');
}
}
解决方案
这就是您应该避免允许表单组件直接更改您的实体的原因之一。它将设置数据,然后验证它。因此,提交表单后,实体完全有可能处于无效状态。
无论如何,您可以指定空值应该是什么:
->add('fname', TextType::class, ['label' => 'First Name', 'empty_data' => ''])
推荐阅读
- javascript - 在不干扰排序顺序的情况下连接/合并两个数组以下的最佳方法是什么?
- python - 熊猫:雅虎财经的缺失值
- html - 如何在没有 npm(和纱线)的情况下将“bulma-helpers”添加到我的 HTML
- c++ - 如何将最小值和最大值放入函数中
- python - Python Flask SQL 查询到 HTML 页表
- entity-framework - EF core 3 后 IDENTITY 列的变化
- unity3d - 在 Unity 中,如何查找缺失脚本的类型?
- mysql - case 表达式的替代方案,因为它不支持 'when' 中的 '<' ,'>' 和 '='
- postgresql - 从我的计算机远程连接到 postgresql 服务器的工作不适用于托管服务提供商的
- java - 在 Java 中解析更复杂的 JSON