Php Symfony可选电话输入验证完整性错误:列';电话';不能为空
我拥有以下实体:Php Symfony可选电话输入验证完整性错误:列';电话';不能为空,php,symfony,symfony-3.4,Php,Symfony,Symfony 3.4,我拥有以下实体: namespace AppBundle\Entity; use Doctrine\ORM\Mapping as ORM; use FOS\UserBundle\Model\User as BaseUser; use Symfony\Component\Validator\Constraints as Assert; use Misd\PhoneNumberBundle\Validator\Constraints\PhoneNumber as AssertPhoneNumber
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use FOS\UserBundle\Model\User as BaseUser;
use Symfony\Component\Validator\Constraints as Assert;
use Misd\PhoneNumberBundle\Validator\Constraints\PhoneNumber as AssertPhoneNumber;
/**
* @ORM\Entity
* @ORM\Table(name="users")
*/
class User extends BaseUser
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", length=25)
* @Assert\NotBlank(message="Please enter your name.", groups={"Registration", "Profile"})
* @Assert\Length(
* min=3,
* max=25,
* minMessage="The name is too short.",
* maxMessage="The name is too long.",
* groups={"Registration", "Profile"}
* )
*/
protected $name;
/**
* @ORM\Column(type="string", length=25)
* @Assert\NotBlank(message="Please enter your name.", groups={"Registration", "Profile"})
* @Assert\Length(
* min=3,
* max=25,
* minMessage="The surname is too short.",
* maxMessage="The surname is too long.",
* groups={"Registration", "Profile"}
* )
*/
protected $surname;
/**
* @ORM\Column(type="phone_number")
* @AssertPhoneNumber
*/
protected $phone;
/**
* @ORM\Column(type="string", length=255)
* @Assert\Length(
* min=0,
* max=255,
* groups={"Registration", "Profile"}
* )
*/
protected $organization;
/**
* @ORM\Column(type="string", length=255)
* @Assert\Length(
* min=0,
* max=255,
* groups={"Registration", "Profile"}
* )
*/
protected $occupation;
public function __construct()
{
parent::__construct();
}
public function setName(string $name)
{
$this->name=$name;
return $this;
}
public function getName()
{
return $this->name;
}
public function setSurname(string $surname)
{
$this->surname=$surname;
return $this;
}
public function getSurname()
{
return $this->name;
}
public function setPhone($phoneNum)
{
$this->phone=$phoneNum;
return $this;
}
public function getPhone()
{
return $this->phone;
}
public function setOrganization($organization)
{
$this->organization=$organization;
return $this;
}
public function getOrganization()
{
return $this->organization;
}
public function setOccupation($occupation)
{
$this->occupation=$occupation;
return $this;
}
public function getOccupation()
{
return $this->occupation;
}
}
如您所见,它有一个名为$phone
的字段:
/**
* @ORM\Column(type="phone_number")
* @AssertPhoneNumber
*/
protected $phone;
按照我的逻辑,该字段应该是可选的,不需要注册,因此为了做到这一点,我相应地扩展了FosUserBundle表单:
namespace AppBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Misd\PhoneNumberBundle\Form\Type\PhoneNumberType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
class RegistrationType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('name',TextType::class,["label"=>"register.name","required"=>true,'translation_domain' => 'FOSUserBundle'])
->add('surname',TextType::class,["label"=>"register.surname","required"=>true,'translation_domain' => 'FOSUserBundle'])
->add('phone',PhoneNumberType::class,["label"=>"register.phonenum",'translation_domain' => 'FOSUserBundle'])
->add('organization',TextType::class,["label"=>"register.organization","required"=>false,'translation_domain' => 'FOSUserBundle'])
->add('occupation',TextType::class,["label"=>"register.position","required"=>false,'translation_domain' => 'FOSUserBundle']);
}
public function getParent()
{
return 'FOS\UserBundle\Form\Type\RegistrationFormType';
}
public function getBlockPrefix()
{
return 'app_user_registration';
}
// For Symfony 2.x
public function getName()
{
return $this->getBlockPrefix();
}
}
如您所见,我将其设置为NotRequired,如您在以下代码段中所见:
->add('phone',PhoneNumberType::class,["label"=>"register.phonenum",'translation_domain' => 'FOSUserBundle'])
但是,当我尝试测试注册时,会出现以下错误:
SQLSTATE[23000]:完整性约束冲突:1048列“phone”不能为null
为了避免此类错误,我还将定义更改为:
/**
* @ORM\Column(type="phone_number")
*/
protected $phone;
但我仍然得到了错误。是一种将字段设置为null的方法吗
同样为了验证,我使用了php的giggsey/libphonenumber
coposer包
/**
* @ORM\Column(type="phone_number", nullable=true)
* @AssertPhoneNumber
*/
protected $phone;
我相信这会奏效 条令注释中缺少一个参数:
/**
* @ORM\Column(type="phone_number", nullable=true)
* @AssertPhoneNumber
*/
protected $phone;
不要忘记运行d:s:u--dump sql |--force
或生成迁移;)