Symfony2 DateTime null接受
因此,我希望能够向我的DOB字段发送一个空选项 这是我的表单生成器:Symfony2 DateTime null接受,symfony,datetime,doctrine,Symfony,Datetime,Doctrine,因此,我希望能够向我的DOB字段发送一个空选项 这是我的表单生成器: ->add('birthDate', DateType::class, array( 'widget' => 'single_text', 'format' => 'yyyy-MM-dd')) 这是我实体中的字段 /** * @ORM\Column( * type="date", * nullab
->add('birthDate', DateType::class, array(
'widget' => 'single_text',
'format' => 'yyyy-MM-dd'))
这是我实体中的字段
/**
* @ORM\Column(
* type="date",
* nullable=true
* )
* @JMS\Groups("single")
*
* @var \DateTime
*/
protected $birthDate;
当我试图发送一个空值时,我得到了一个错误消息
Expected argument of type "DateTime", "NULL" given
有什么想法吗
CRITICAL - Uncaught PHP Exception Symfony\Component\PropertyAccess\Exception\InvalidArgumentException: "Expected argument of type "DateTime", "NULL" given" at /var/www/server.local/vendor/symfony/symfony/src/Symfony/Component/PropertyAccess/PropertyAccessor.php line 253
$type = $trace[$i]['args'][0];
$type = is_object($type) ? get_class($type) : gettype($type);
throw new InvalidArgumentException(sprintf('Expected argument of type "%s", "%s" given', substr($message, $pos, strpos($message, ',', $pos) - $pos), $type));
}
}不要向它传递任何值。通过执行以下操作,使字段不是必需的:
->add(
'birthDate',
DateType::class,
array(
'required' => false,
'widget' => 'single_text',
'format' => 'yyyy-MM-dd'
)
)
我一直在我的项目中使用DOB字段。试试这个。 我的ORM文件看起来像这样
在本例中,问题是由PHP类型暗示引起的。 如果使用类型暗示(例如
setBirthDate(\DateTime$value)
),那么PHP会强制您实际提供一个DateTime对象。显然,null不是这样的对象。要解决此问题,可以为$value
提供如下默认值:setBirthDate(\DateTime$value=null)
这是有文档记录的行为,并在PHP文档()中进行了解释
相关段落:
要指定类型声明,应在参数名称之前添加类型名称。如果参数的默认值设置为NULL,则可以进行声明以接受NULL值
正如注释中所提到的,问题是由于类型提示的setter而出现的。有两种解决方案: 1.在您的表格上使用
'by_reference'=>true
:
$builder->add(
'birthDate',
DateType::class,
[
'widget' => 'single_text',
'format' => 'yyyy-MM-dd',
'by_reference' => true,
]
);
2.让您的设定者接受null
:
public function setBirthDate(\DateTime $value = null)
{
.....
}
当您遇到此错误时?在提交带有birthDate字段的表单时,您是否确保DB架构与实体同步?我确定,架构与数据库同步您的$birthDate的setter是否如下所示:setBirthDate(\DateTime$value)?如果是,将其更改为setBirthDate(\DateTime$value=null)如何设置表单数据?->HandlerRequest($request)?不,正如你看到的,我使用的是ORM注释,这就是为什么你的解决方案对我不起作用,这就是我认为ORM注释不做任何验证的原因,它们映射到数据库。如果您使用的是@Assert\Datetime或@Assert\NotNull,那么我可以理解验证失败的原因。请使用Symfony推荐的表单提交方式,现在使用推荐方式已经太晚了,因为我已经有一个大的工作项目。好的,那么你如何设置表单数据?对我来说并不简单。我已经创建了一个angular指令,它由3个day、date和Dreamnote的下拉输入组成。注意:对于PHP7.1,您还可以将hint输入为可选的null:
setBirthDate(?\DateTime$value)
您的第一个解决方案更有意义。第二个也在工作,但这将使字段保存不需要的数据(null)
public function setBirthDate(\DateTime $value = null)
{
.....
}