所以,我希望能够向我的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));
}
}
答案 0 :(得分:17)
在这种情况下,问题是由PHP类型提示引起的。
如果使用类型提示(例如setBirthDate(\DateTime $value)
),那么PHP会强制您实际提供DateTime对象。显然,null不是这样的对象。要解决此问题,可以为$value
提供如下默认值:setBirthDate(\DateTime $value = null)
。
这是记录在案的行为,并在PHP文档(http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration)中进行了解释。
相关段落:
要指定类型声明,应在参数名称前添加类型名称。如果参数的默认值设置为NULL,则可以使声明接受NULL值。
答案 1 :(得分:4)
问题出现在类型提示的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)
{
.....
}
答案 2 :(得分:2)
不要传递任何值。这样做不需要字段:
->add(
'birthDate',
DateType::class,
array(
'required' => false,
'widget' => 'single_text',
'format' => 'yyyy-MM-dd'
)
)
答案 3 :(得分:0)
我一直在我的项目中使用DOB字段。试试这个。
我的ORM文件看起来像<field name="dob" type="date" column="dob" nullable="true"/>
->add('dob','birthday',array(
'widget' => 'single_text',
'format' => 'dd-MM-yyyy',
'required' => false,
'attr' => array('class' => 'datepicker',
'data-provide' => 'datepicker','data-date-format' => 'dd-mm-yyyy')
))