Symfony2 DateTime null接受

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

因此,我希望能够向我的DOB字段发送一个空选项

这是我的表单生成器:

->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)
{
   .....
}