Symfony2 DateTime null接受

时间:2016-04-13 12:48:18

标签: symfony datetime doctrine

所以,我希望能够向我的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));
}

}

4 个答案:

答案 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')
        ))