在Symfony2(Doctrine)中调用非对象的成员函数format()

时间:2015-02-24 07:44:35

标签: php symfony datetime doctrine-orm doctrine

我的控制器中有一些错误。

我通过此配置配置实体:

pv\MyBundle\Entity\NewsAuthorHistory:
  type: entity
  table: news_authors_history
  fields:
    id:
      id: true
      type: integer
      unsigned: false
      nullable: false
      column: id
      generator:
        strategy: AUTO
    date:
      type: datetime
      nullable: true
      column: date
    author_id:
      type: integer
      unsigned: true
      column: author_id
      nullable: false
    news_id:
      type: integer
      unsigned: true
      column: news_id
      nullable: false
  manyToOne:
    news:
      targetEntity: pv\MyBundle\Entity\News
      joinColumn:
        name: news_id
        referencedColumnName: id
    author:
      targetEntity: pv\MyBundle\Entity\Authors
      joinColumn:
        name: author_id
        referencedColumnName: id

我的控制器中有这段代码

$history_event = new NewsAuthorHistory();
$history_event->setAuthorId($author->getId());
$history_event->setNewsId($news->getId());
$history_event->setDate(\DateTime('now'));

$em->persist($history_event);
$em->flush();

但是,如果我尝试运行此代码,我就有了

  

致命错误:在非对象中调用成员函数format()   /vendor/doctrine/dbal/lib/Doctrine/DBAL/Types/DateTimeType.php在线   53

我已经阅读了很多关于此错误的帖子,但找不到合适的解决方案。

更新 一些魔法! O_o我将以下代码添加到文件DateTimeType.php

if (!method_exists($value, 'format')) {
  var_dump($value); 
  var_dump(debug_backtrace()); 
} 

这里魔术开始......到日期字段填充...有关csrf-token的信息。 怎么样?为什么? - 我不知道...... :(

不幸的是,我无法解决问题。我通过SQL代码生成解决了这个问题,并将其实现指向实体管理器。

2 个答案:

答案 0 :(得分:3)

$history_event->setDate(\DateTime('now'));

应该是

$history_event->setDate(new \DateTime());

您的错误是您没有实例化您的实体所期望的DateTime对象。此外,请记住nowDateTime的默认参数。

修改

您可以尝试在创建新的DateTime之前插入此代码片段吗?

date_default_timezone_set('America/New_York'); //Just an example to understand what's going on

答案 1 :(得分:0)

在您更新后,我将DateTimeType.php中的convertToDatabaseValue修改为:

public function convertToDatabaseValue($value, AbstractPlatform $platform)
{
    if(is_array($value)){
        $value = date_create($value['year'].'-'.$value['month'].'-'.$value['day']);
    }
    return ($value !== null)
        ? $value->format($platform->getDateTimeFormatString()) : null;
}

现在可行。