Проверка формы в Symfony 4 не работает - PullRequest
0 голосов
/ 29 сентября 2018

Я создал сущность Testme и создал файл crud с bin/console make:crud и пытаюсь добавить правило проверки в форму, но оно не работает:

Моя сущность:

<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Entity(repositoryClass="App\Repository\TestmeRepository")
 */
class Testme
{
 /**
 * @ORM\Id()
 * @ORM\GeneratedValue()
 * @ORM\Column(type="integer")
 */
private $id;

/**
 * @Assert\NotBlank()
 * @ORM\Column(type="string", length=255)
 */
private $name;

/**
 * @ORM\Column(type="string", length=255, nullable=true)
 */
private $description;

....

Форма:

<?php

namespace App\Form;

use App\Entity\Testme;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class TestmeType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name')
        ->add('description')
    ;
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'data_class' => Testme::class,
    ]);
}
}

Действие контроллера:

/**
 * @Route("/{id}/edit", name="testme_edit", methods="GET|POST")
 */
public function edit(Request $request, Testme $testme): Response
{
    $form = $this->createForm(TestmeType::class, $testme);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $this->getDoctrine()->getManager()->flush();

        return $this->redirectToRoute('testme_edit', ['id' => $testme->getId()]);
    }

    return $this->render('testme/edit.html.twig', [
        'testme' => $testme,
        'form' => $form->createView(),
    ]);
}

Если поле name не заполнено, ошибка проверки корректно отображается при создании нового объекта, но когда я редактирую его и очищаю поле name, я получаю InvalidArgumentException в строке $form->handleRequest($request);:

Ожидаемый аргумент типа "string", задано значение "NULL".

Чего мне не хватает?

РЕДАКТИРОВАТЬ: весь код был сгенерирован командами make:Entity и make:crud, я только добавил @Assert\NotBlank() в $nameсвойство.

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Привязка формы и размещенных данных применяется до любой проверки.Если вы введете подсказки для сеттеров / сумматоров, вы будете работать в таких сценариях.

Из моего POV вы не должны изменять свой «модельный» код, чтобы он соответствовал стороннему коду (компонент формы, здесь), так как выможет столкнуться с возможными проблемами, такими как неправильное использование метода (если необходимо наличие значения, единственный возможный способ обеспечить требование «не ноль» - это избежать принятия ноля; сам валидатор ничего не сделает, как только вы «забудете»)чтобы вызвать valid для объекта, и даже в этом случае у вас все еще есть действительный объект и (*1007*).

Вместо этого вам следует привязать DTO или ValueObjects к вашей форме.Эти объекты могут принимать любые значения, которые вы хотите (в основном это ожидаемое вами значение и значение NULL).Затем вы можете выполнить проверку и, например, с помощью «команды» (не symfony, «команды» в концепции «DDD») вы можете заполнить и выполнить другие «передачи данных» или манипуляции для real сущностей.

Даже если ответ ste заставит его работать, это концептуально неверно, так как подвергает ваш код "доменным рискам", описанным выше в этом ответе.

0 голосов
/ 30 сентября 2018

Вы должны удалить подсказки типов в ваших установщиках в ваших сущностях или сделать аргумент по умолчанию нулевым.

Возможно, компонент формы не обновляет поля (т.е. вызывает setXXX), если они не изменены (как, например, вслучай нового объекта).

Проверка выполняется в объекте, поскольку там определены ваши ограничения (т. е. аннотации @Assert).

Вы можете выполнить проверку непосредственно в форме с помощью ограничений.Смотри https://symfony.com/doc/current/form/without_class.html#adding-validation

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...