问题描述
在我的表单上,我正在使用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
这应该可以在编辑页面上解决断言问题。