【问题标题】:Why can't I create a Doctrine model named 'Album'为什么我不能创建一个名为“Album”的 Doctrine 模型
【发布时间】:2009-12-06 19:08:00
【问题描述】:

我在我的项目中使用 Doctrine 作为 ORM,但遇到了一个奇怪的错误:

使用以下 YAML:

Album:
  tableName: dpp_album
  actAs: [Timestampable]
  columns:
    name: string(255)
    description: string(255)
    online: boolean

然后我生成我的模型,但在刷新我的页面并自动加载模型时,PHP 会出现此错误:

致命错误:类 'BaseAlbum' 不是 在发现 E:\sites\dpp\system\application\models\Album.php 在第 13 行

奇怪的是,我所有的其他模型都很好,并且在这些情况下可以找到基类。

将“专辑”名称更改为“设置”之类的名称时,它可以正常工作!是不是很奇怪?!

因此,尽管错误消息暗示了其他内容,但使用“专辑”似乎存在某种冲突。改成复数Albums也没用,其他都行!

有什么建议吗?

谢谢!

【问题讨论】:

  • 根据您的描述,我猜“Album”是该 ORM 的保留关键字。也许有一种方法可以使用分隔符来规避这个......
  • 我也是这么想的,不过如果是这样的话,那就太奇怪了!但是在搜索文档和源代码时,我找不到任何名为“专辑”的东西...... :-(
  • google.com/… Google 代码也发现了 Album 类的用途。
  • 当然可以,它是模型的通用名称,但不包含在标准 Doctrine 分布中。

标签: php orm doctrine


【解决方案1】:

问题在于模型类的自动加载顺序。

生成的“基础”模型位于“模型/生成”目录下,其他模型位于上述目录下。

无法确定加载顺序,因此有时模型会在其扩展的基础模型之前加载,从而引发此错误。

在我的引导文件中,我现在明确地包含了目录的加载顺序,如下所示:

Doctrine::loadModels(array(APPPATH.'/models/generated', APPPATH.'/models'));

文档使用了很多生成文件的示例,但在谈到引导配置时没有提到这种行为。

不管怎样,很高兴这个问题现在解决了! :-)

【讨论】:

    【解决方案2】:

    如果设置了选项generateBaseClasses(默认)generateModelsFromYaml() 将在您的情况下创建一个类AlbumBase(默认在子目录generated 中)和一个空类Album extends AlbumBase。 IE。如果 Album 被实例化 AlbumBase 必须已经知道或被某个自动加载器加载。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-17
      • 2012-07-23
      • 2020-09-01
      • 1970-01-01
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多