如何在删除的小部件上禁用@Assert 验证
How to disable @Assert validation on removed widgets
我不知道为什么断言验证仍然适用于我删除的小部件!
我创建了一个表单
$form = $this->createForm(UserType::class, $doctor);
然后我从中删除了一些字段
$form ->remove("picture");
$form ->remove("phone");
确实从视图中删除了字段!但是当我点击提交时,我仍然收到 "@Assert\NotBlank()
错误信息!在 phone!
我在控制器上做了
$doctor = new User();
$form = $this->createForm(UserType::class, $doctor);
$form ->remove("picture");
$form ->remove("phone");
这是用户实体的代码(我删除了 getter 和 setter)
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
* @UniqueEntity(
* fields={"username"},
* message="The username is already used."
* )
* @UniqueEntity(
* fields={"email"},
* message="The Email is already used."
* )
*/
class User implements UserInterface
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255 , unique=true)
* @Assert\NotBlank()
*/
private $username;
/**
* @ORM\Column(type="string", length=255 , unique=true)
* @Assert\NotBlank()
* @Assert\Email(message="This Email is not valid ")
*/
private $email;
/**
* @ORM\Column(type="string", length=255 )
* @Assert\NotBlank()
* @Assert\Length(
* min = 8, max = 30,
* minMessage = "Your password must be between 8 and 30 characters.")
* @Assert\EqualTo(propertyPath = "password2", message="Passwords does not match!" )
*/
private $password;
/**
* @Assert\NotBlank()
* @Assert\EqualTo(propertyPath = "password", message="Passwords does not match!" )
*/
private $password2;
/**
* @ORM\Column(type="string", length=50, nullable=true),
* @Assert\NotBlank(),
* @Assert\Regex(
* pattern="/[0-9]{8}/",
* message="Invalid Phone number"
* )
*/
private $phone;
/**
* @ORM\Column(type="string", length=255)
*/
private $picture;
/**
* @ORM\Column(type="string", length=255)
*/
private $braclet_id;
/**
* @ORM\Column(type="boolean")
*/
private $is_doctor;
/**
* @Assert\Length(min=5, max=100)
* @ORM\Column(type="string", length=255)
* @Assert\NotBlank()
*/
private $Full_Name;
/**
* @ORM\Column(type="boolean")
*/
private $isActive;
}
视图代码如下:
{{ form_start(form, {attr: {novalidate: 'novalidate'}}) }}
{{ form_widget(form.Full_Name, {'attr': {'class': 'form-control', 'placeholder': 'Full Name','type': 'text'} }) }}
{{ form_errors(form.Full_Name) }}
{{ form_widget(form.username, {'attr': {'class': 'form-control', 'placeholder': 'Username'} }) }}
{{ form_errors(form.username) }}
{{ form_widget(form.email, {'attr': {'class': 'form-control', 'placeholder': 'Email Adress'} }) }}
{{ form_errors(form.email) }}
{{ form_widget(form.password, {'attr': {'class': 'form-control', 'placeholder': 'Password','type': 'Password'} }) }}
{{ form_errors(form.password) }}
{{ form_widget(form.password2, {'attr': {'class': 'form-control', 'placeholder': 'Confirm Password','type': 'Password'} }) }}
{{ form_errors(form.password2) }}
<button class="btn btn-raised g-bg-cyan waves-effect">SIGN UP</button>
{{ form_rest(form) }}
{{ form_end(form) }}
那是因为无论您添加或删除哪些字段,您都在验证您的实体。在这些情况下,您可以使用验证组:
https://symfony.com/doc/current/validation/groups.html
因此,对于您的情况,您可以在 "Default" 旁边创建一个新组,例如 "doctor"。
对于两者都需要验证的所有字段添加:
* @Assert\NotBlank(groups={"Default", "doctor"})
对于 phone 字段:
* @Assert\NotBlank(groups={"Default"})
不要忘记在表单中设置正确的验证组:
https://symfony.com/doc/current/form/validation_groups.html
我不知道为什么断言验证仍然适用于我删除的小部件!
我创建了一个表单
$form = $this->createForm(UserType::class, $doctor);
然后我从中删除了一些字段
$form ->remove("picture");
$form ->remove("phone");
确实从视图中删除了字段!但是当我点击提交时,我仍然收到 "@Assert\NotBlank()
错误信息!在 phone!
我在控制器上做了
$doctor = new User();
$form = $this->createForm(UserType::class, $doctor);
$form ->remove("picture");
$form ->remove("phone");
这是用户实体的代码(我删除了 getter 和 setter)
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
* @UniqueEntity(
* fields={"username"},
* message="The username is already used."
* )
* @UniqueEntity(
* fields={"email"},
* message="The Email is already used."
* )
*/
class User implements UserInterface
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255 , unique=true)
* @Assert\NotBlank()
*/
private $username;
/**
* @ORM\Column(type="string", length=255 , unique=true)
* @Assert\NotBlank()
* @Assert\Email(message="This Email is not valid ")
*/
private $email;
/**
* @ORM\Column(type="string", length=255 )
* @Assert\NotBlank()
* @Assert\Length(
* min = 8, max = 30,
* minMessage = "Your password must be between 8 and 30 characters.")
* @Assert\EqualTo(propertyPath = "password2", message="Passwords does not match!" )
*/
private $password;
/**
* @Assert\NotBlank()
* @Assert\EqualTo(propertyPath = "password", message="Passwords does not match!" )
*/
private $password2;
/**
* @ORM\Column(type="string", length=50, nullable=true),
* @Assert\NotBlank(),
* @Assert\Regex(
* pattern="/[0-9]{8}/",
* message="Invalid Phone number"
* )
*/
private $phone;
/**
* @ORM\Column(type="string", length=255)
*/
private $picture;
/**
* @ORM\Column(type="string", length=255)
*/
private $braclet_id;
/**
* @ORM\Column(type="boolean")
*/
private $is_doctor;
/**
* @Assert\Length(min=5, max=100)
* @ORM\Column(type="string", length=255)
* @Assert\NotBlank()
*/
private $Full_Name;
/**
* @ORM\Column(type="boolean")
*/
private $isActive;
}
视图代码如下:
{{ form_start(form, {attr: {novalidate: 'novalidate'}}) }}
{{ form_widget(form.Full_Name, {'attr': {'class': 'form-control', 'placeholder': 'Full Name','type': 'text'} }) }}
{{ form_errors(form.Full_Name) }}
{{ form_widget(form.username, {'attr': {'class': 'form-control', 'placeholder': 'Username'} }) }}
{{ form_errors(form.username) }}
{{ form_widget(form.email, {'attr': {'class': 'form-control', 'placeholder': 'Email Adress'} }) }}
{{ form_errors(form.email) }}
{{ form_widget(form.password, {'attr': {'class': 'form-control', 'placeholder': 'Password','type': 'Password'} }) }}
{{ form_errors(form.password) }}
{{ form_widget(form.password2, {'attr': {'class': 'form-control', 'placeholder': 'Confirm Password','type': 'Password'} }) }}
{{ form_errors(form.password2) }}
<button class="btn btn-raised g-bg-cyan waves-effect">SIGN UP</button>
{{ form_rest(form) }}
{{ form_end(form) }}
那是因为无论您添加或删除哪些字段,您都在验证您的实体。在这些情况下,您可以使用验证组:
https://symfony.com/doc/current/validation/groups.html
因此,对于您的情况,您可以在 "Default" 旁边创建一个新组,例如 "doctor"。
对于两者都需要验证的所有字段添加:
* @Assert\NotBlank(groups={"Default", "doctor"})
对于 phone 字段:
* @Assert\NotBlank(groups={"Default"})
不要忘记在表单中设置正确的验证组: https://symfony.com/doc/current/form/validation_groups.html