如何解决为什么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 页面上不起作用? 顺便说一句,我没有使用任何验证组。
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
这应该可以在编辑页面上解决断言问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。