Неизменное поле формы Symfony возвращает ошибку типа проверки - PullRequest
4 голосов
/ 24 июня 2019

Попытка обновить сущность и отправить поле со значением, которое остается неизменным, приводит к ошибке типа.Что я делаю не так?

Entity:

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

...

FormType:

<?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представить данные формы.Если объект, который я обновляю, имеет записьQuota 1000, и я отправляю форму с другим значением.Все работает и обновляется.

Но если я отправляю свою форму с recordQuota: 1000, которая должна оставить значение без изменений, я получаю ошибку неверного типа:

            "recordQuota": {
                "errors": [
                    "This value should be of type integer."
                ]
            }

Дополнительная информация:

Я использую $form->submit вместо handleRequest, потому что я использую патч.Поэтому мне нужно иметь возможность включать / отключать $clearMissing.Но даже при использовании handleRequest возникает та же проблема.

Даже при типизации recordQuota как int перед передачей его в форму все равно не удается.

Если я удаляю всю информацию о типе из формы иEntity, я получаю «Это значение должно иметь тип string» при фактическом изменении.

Ответы [ 2 ]

0 голосов
/ 26 июня 2019

Это была проблема с комбинацией auto_mapping валидатора Symfony 4.3, описанной здесь: https://symfony.com/blog/new-in-symfony-4-3-automatic-validation

И пакет производителя, добавляющий неправильный тип в поля bigint.

Смотрите здесь: https://github.com/symfony/maker-bundle/issues/429

Ответ состоял в том, чтобы изменить геттеры и сеттеры в сущности с:

    public function getRecordQuota(): ?int
    {
        return $this->recordQuota;
    }

    public function setRecordQuota(?int $recordQuota): self
    {
        $this->recordQuota = $recordQuota;

        return $this;
    }

до

    public function getRecordQuota(): ?string
    {
        return $this->recordQuota;
    }

    public function setRecordQuota(?string $recordQuota): self
    {
        $this->recordQuota = $recordQuota;

        return $this;
    }

В качестве альтернативы, можно отключить auto_mapping в конфигурации валидатора.

0 голосов
/ 24 июня 2019

Редактировать: обратите внимание, что верно следующее, если тип поля TextType, но IntegerType отлично работает с @Assert\Type("integer").Что делает мой ответ недействительным / неуместным ...

Вы используете аннотацию @Assert\Type("integer"), но это означает следующее:

  • значение должно быть целым числом - как тип PHP, как и вызов is_int($value)
  • , и поскольку данные поступают из формы (и, вероятно, без каких-либо преобразователей, как я вижу в вашем коде), это тип string
  • и, следовательно, проверка всегда

@Assert\Type("numeric"):

  • эквивалентно is_numeric($value)
  • по строке, которая будет преобразована в строку прионо достигает поля вашей сущности
...