【问题标题】:No entity manager defined for class DateTime没有为类 DateTime 定义实体管理器
【发布时间】:2023-03-05 14:01:02
【问题描述】:

我已经开始使用Sonata Admin 捆绑包,我正在按照示例说明如何将实体与捆绑包映射以创建管理界面。

我创建了一个名为 Post 的实体,这是配置 yml 文件:

Emiliano\PostsBundle\Entity\Post:
type: entity
table: null
repositoryClass: Emiliano\PostsBundle\Entity\PostRepository
id:
    id:
        type: integer
        id: true
        generator:
            strategy: AUTO
fields:
    title:
        type: string
        column: Title
        lenght: 100
    published:
        type: boolean
        column: Published
    publishingDate:
        type: datetime
        column: Publishing_Date
        nullable: TRUE
    lifecycleCallbacks: {  }

然后在我的Admin 类中我有configureFormFields 方法:

protected function configureFormFields(FormMapper $formMapper) {
    $formMapper->add('title', 'text')
       ->add('published', 'checkbox', array('required' => false))
       ->add('publishingDate', 'sonata_type_model_hidden');
}

我在奏鸣曲管理员documentation 上找到了sonata_type_model_hidden。我想要实现的是以编程方式处理发布日期(例如,仅在选中复选框 published 时设置日期)将实现隐藏给用户。

在创建、删除和读取方面一切正常,当涉及到修改实体时,我在堆栈跟踪中收到此消息:

No entity manager defined for class DateTime
In sonata-project/doctrine-orm-admin-bundle/Sonata/DoctrineORMAdminBundle/Model/ModelManager.php at line 214

如果我显示该字段一切正常,我也尝试使用:

->add('publishingDate', 'hidden');

没有成功。

这到底是什么问题?是因为Sonata Admin 试图用实体值填写表单,并且对于 publishingDate 有一个DateTime 而在表单规范中我写了一个sonata_type_model_hidden?如果是这样,我该如何规避呢?

【问题讨论】:

  • 那么 ModelManager 的第 214 行是什么?我猜您可能使用的是 DateTime 而不是 \DateTime。纯属猜测。
  • $em = $this->registry->getManagerForClass($class); 我正在使用 \DateTime。
  • 然后检查你的代码,因为我很确定你有 $class= 'DateTime' 而且肯定不会有 $em 。
  • 我实际上不明白这是奏鸣曲管理错误还是我忽略的东西,我没有创建表单,捆绑包映射我的实体创建管理界面并检查@987654336 @ 我写的,但我无处传递 DateTime 对象。无论如何,我从之前的评论中检查了$class 变量,它是DateTime,我试图将其更改为\DateTime,但没有成功。

标签: symfony symfony-forms sonata-admin symfony-sonata


【解决方案1】:

根据文档,sonata_type_model_hidden 不仅仅是 hidden 字段生成器:

sonata_type_model_hidden 将使用 ModelHiddenType 的实例来呈现隐藏字段。隐藏字段的值是相关实体的标识符。

如果我了解您的问题,您只想在字段 published == true 时设置发布日期

您可以为 eaxmple 使用实体 preSave/preUpdate 生命周期回调

public function preSave() 
{
     /**
      * Check if item is published
      */
     if($this->getPublished()) {
         $this->setPublishingDate(new \DateTime());
     } else {
         $this->setPublishingDate(null);
     }
}

并从 SonataAdmin 表单中删除 publishingDate 字段。

【讨论】:

  • 我已经在使用 preSave/preUpdate 挂钩,我最终从表单中删除了字段,因为它们没有用,但为什么会发生这个错误仍然让我很感兴趣。
猜你喜欢
  • 2015-06-12
  • 2014-05-13
  • 2015-12-14
  • 2015-01-23
  • 2012-05-05
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
相关资源
最近更新 更多