Doctrine lifecycleCallbacks奇怪的行为

时间:2015-11-04 04:27:01

标签: symfony doctrine-orm doctrine

我在yaml中定义了lifecycleCallbacks,如下所示:

lifecycleCallbacks:
    prePersist: [setCreatedAtValue]
    preUpdate: [setUpdatedAtValue]

上面已经生成了各自具有如下功能的实体:

/**
 * @ORM\PrePersist
 */
public function setCreatedAtValue()
{
    if($this->created_at == null)
    {
        $this->created_at = new \DateTime();
    }
}

哪个看起来都很好,对吧?但是,当我尝试打开奏鸣曲管理页面时,我收到以下错误

[Semantical Error] The annotation "@ORM\PrePersist" in method AppBundle\Entity\Article::setCreatedAtValue() was never imported. Did you maybe forget to add a "use" statement for this annotation? 

我之前从未遇到过这种情况,对于该怎么做有点困惑。我使用的是symfony 2.7.6,Doctrine ORM 2.5.1版,Sonata Admin 2.3.7

非常感谢任何帮助

2 个答案:

答案 0 :(得分:2)

由于您使用yaml定义了回调,因此无需使用注释再次定义它们。只需在函数前删除@ORM\PrePersist块的注释,一切都会好的。

如果要使用注释来定义教条属性,则需要先导入它们,然后才能使用它们。为此,您需要在文件的开头添加此行:

use Doctrine\ORM\Mapping as ORM;

答案 1 :(得分:1)

我也遇到了同样的问题。

就我而言,一切正常,直到我没有在JsonResponse中序列化对象。

所以问题是,以前,当我尝试准备包含该类JsonResponse的{​​{1}}时,我并没有使用该实体类(它给了错误)来发送JsonResponse无法对我的课程进行序列化,因为该课程尚未实现JsonResponse接口。

如果您使用SerializablefindAll之类的方法获取对象,这些方法返回Entity对象而不是php数组,则会发生这种情况。

因此,我只是跳过了这些本机方法,并编写了用于获取数据的学说查询。 您还可以实现findBy接口。