尝试更新实体并提交一个值未更改的字段会导致类型错误。我做错了什么?
实体:
<?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)
;
}
...
}
Controller :
...
/**
* @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 仍然会失败。
如果我从表单和实体中删除所有类型信息,在实际进行更改时会得到“此值应为字符串类型”。
最佳答案
编辑:请注意,如果字段类型为 TextType
,则以下内容为真,但是IntegerType
适用于 @Assert\Type("integer")
.这有点使我的回答无效/不相关...
您正在使用 @Assert\Type("integer")
注释,但它的意思是:
- 值必须是整数 -- 作为 PHP 类型,比如调用
is_int($value)
- 并且由于数据来自表单(并且可能没有任何转换器,正如我在您的代码中看到的那样),它的类型是
string
- 因此,验证总是失败
你需要的是@Assert\Type("numeric")
:
- 相当于
is_numeric($value)
- 当它到达您实体的字段时,它将被转换为字符串
关于php - Symfony 表单未更改字段返回验证类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56734818/