为什么symfony assert不能与Edit Page上的novalidation属性一起使用?

问题描述

在我的表单上,我正在使用novalidate属性,如下所示:

{{ form_start(form,{'attr': {novalidate: 'novalidate'}}) }}                

禁用HTML5浏览器验证。 因此,Symfony断言错误出现。 在new.html.twig页面上,它可以正常运行! novalidate属性禁用html5验证,并显示断言错误。

但是,当我在edit.html.twig上使用novalidate属性并将username字段留空(我不在表单上填写)时,@Assert\NotBlank()不起作用。我得到这个错误

在属性路径中给出的类型为“字符串”,“空”的预期参数 “用户名”。

为什么symfony断言在页面上起作用,但是在 edit 页面上不起作用? 顺便说一句,我没有使用任何验证组。

这是我的用户实体的代码(没有getter和setter):

class User implements UserInterface
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

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

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

    /**
     * @ORM\Column(type="string",length=255)
     * @Assert\NotBlank()
     * @Assert\Length(
     *      min = 8,max = 30,*      minMessage = "Your password must be between 6 and 30 characters.")     
     */
    private $password;
    
    /**
     * @ORM\Column(type="json",nullable=true )
     */
    private $roles = [];

以下是格式的代码:

class UserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder,array $options)
    {
        $builder
            ->add('email',EmailType::class )
            ->add('username',TextType::class)
            ->add('password',PasswordType::class)
        ;
    }

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

new.html.twig和edit.html.twig都具有相同的代码:

{{ form_start(form,{'attr': {novalidate: 'novalidate'}}) }}    

    {{ form_widget(form.email,{'attr': {'class': 'form-control',placeholder: 'Email Adress'} }) }}     
    {{form_errors(form.email)}}

    {{ form_widget(form.username,placeholder: 'Username'} }) }}
    {{form_errors(form.username)}}

    {{ form_widget(form.password,{'attr': {'class': 'form-control'} }) }}
    {{form_errors(form.password)}}

    <button class="btn btn-success">Submit</button>
{{ form_rest(form) }}
{{ form_end(form) }}

控制器代码:

/**
 * @Route("/new",name="user_new",methods={"GET","POST"})
 */
public function new(Request $request): Response
{
    $user = new User();
    $form = $this->createForm(UserType::class,$user);
    $form->handleRequest($request);

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

        return $this->redirectToRoute('user_index');
    }

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


/**
 * @Route("/{id}/edit",name="user_edit","POST"})
 */
public function edit(Request $request,User $user): Response
{
    $form = $this->createForm(UserType::class,$user);
    $form->handleRequest($request);

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

        return $this->redirectToRoute('user_index');
    }

    return $this->render('user/edit.html.twig',]);
}

我的getter和setter:

public function getEmail(): ?string
{
    return $this->email;
}

public function setEmail(string $email): self
{
    $this->email = $email;

    return $this;
}
public function getUsername(): ?string
{
    return $this->username;
}

public function setUsername(string $username): self
{
    $this->username = $username;

    return $this;
}


public function getPassword(): ?string
{
    return $this->password;
}

public function setPassword(string $password): self
{
    $this->password = $password;

    return $this;
}

解决方法

我认为您应该在所有设置器的字符串类型上添加?符号。

例如,将其更改为来自 setUsername(string $username): self setUsername(?string $username): self

这应该可以在编辑页面上解决断言问题。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...