【发布时间】:2019-06-24 10:38:35
【问题描述】:
尝试更新实体并提交值未更改的字段会导致类型错误。我做错了什么?
实体:
<?php
namespace App\Entity;
use Symfony\Component\Validator\Constraints as Assert;
...
class User implements UserInterface
{
...
/**
* @ORM\Column(type="bigint", nullable=true)
* @Groups({"default", "listing"})
* @Assert\Type("integer")
*/
private $recordQuota;
...
表单类型:
<?php
namespace App\Form;
...
class UserType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
...
->add('recordQuota', IntegerType::class)
;
}
...
}
控制器:
...
/**
* @Route("/api/user/{id}", name="editUser")
* @Method({"PUT", "PATCH"})
* @Rest\View()
*/
public function updateAction(Request $request, User $user)
{
$form = $this->createForm(UserType::class, $user);
$data = $request->request->get('user');
$clearMissing = $request->getMethod() != 'PATCH';
$form->submit($data, $clearMissing);
if ($form->isSubmitted() && $form->isValid()) {
...
我正在使用 PostMan 提交表单数据。 如果我正在更新的实体的 recordQuota 为 1000,我提交的表单具有不同的值。一切正常并更新。
但是,如果我使用 recordQuota: 1000 提交表单,这应该保持值不变,我会收到不正确的类型错误:
"recordQuota": {
"errors": [
"This value should be of type integer."
]
}
附加信息:
我使用的是$form->submit 而不是handleRequest,因为我使用的是补丁。所以我需要能够启用/禁用$clearMissing。但即使使用handleRequest 也会产生同样的问题。
即使在将它传递给表单之前将 recordQuota 类型转换为 int 仍然失败。
如果我从表单和实体中删除所有类型信息,我会在实际进行更改时得到“此值应为字符串类型”。
【问题讨论】:
-
和我自己的问题类似(stackoverflow.com/questions/56690952/…)。仍然没有解决方案。虽然,
Assert仅用于约束/检查/确认/验证,但它绝不会更改输入值的类型。 -
所以,我已经尝试了您的代码,它实际上似乎工作正常——
Type('integer')和IntegerType表单字段产生正确的结果(尽管在 HTML 表单环境中)。还有其他信息要分享吗? -
太糟糕了,我试图重现你的错误仍然失败——我的意思是,一切正常。我对 ATM 的所有想法都类似于远程调试,要求您这样做并复制粘贴,这似乎适得其反。没有更好的想法 ATM,对不起。
-
请发布您的 getter/setter
标签: php symfony symfony-forms symfony-4.3