为什么从'A','B'开始生成的Doctrine模型类会导致崩溃,但那些以'X'或'Z'开头的模型类不会

时间:2010-08-18 08:36:05

标签: php codeigniter doctrine

我正在使用Doctrine和CodeIgniter。

我无法弄清楚为什么我的YaML中生成的模型从“A”崩溃开始的逻辑。

例如,从以下YaML生成模型可以正常工作:

Pguy:
  columns:
    ptext: string(255)

同样地:

Zguy:
  columns:
    ztext: string(255)

将生成 models / Zguy.php models / generated / BaseZGuy.php ,它们也可以正常工作。

但是,如果我用'A'开始我的类名,生成的模型将导致失败:

Aguy:
  columns:
    atext: string(255)

从'B'开始做同样的事情 - 崩溃!

我不明白为什么会这样。文件中的代码 Zguy.php | BaseZguy.php Aguy.php |中的代码完全相同BaseAguy.php - 除了类和变量起始字母。

想法?

(免责声明:我是金发女郎)

3 个答案:

答案 0 :(得分:0)

我知道doctrine会按字母顺序加载模型,这可能会导致依赖项出现问题,例如,您的模型“Amodel”与您的“Kmodel”存在ManyToMany关系,这会导致问题,因为Kmodel尚未知道教义。使用 B aseModels也可能发生这种情况。

这有帮助吗?如果没有,请更好地定义“崩溃”。

答案 1 :(得分:0)

我曾经遇到过同样的问题。这是很久以前的事了,但就我而言,它与订单模型的加载以及每个类扩展自己的BasicClass父类的事实有关。即:

Class A extends BaseA {

}

Doctrine按字母顺序自动加载类。在这种情况下,自动加载会尝试加载A类,该类扩展了尚未加载的BaseA类。这就解释了为什么所有以A开头的类都会崩溃,所有名称后面的字母开头然后Base的类都不会崩溃。

也许我完全错了,但那是我过去遇到的问题。如果我记得正确,我将所有的基类放在一个Abstract目录中来修复它。在我的情况下,我没有字母表中较早的名字,所以对我来说这是一个肮脏但有效的解决方法。

BTW,在发布这样的问题时,一些额外的代码示例会很好。现在人们不得不猜测。

答案 2 :(得分:0)

谢谢'Stegeman'和'smoove666'。确实,模型的字母自动加载似乎导致了我的问题。

生成的模型最终出现在目录结构中,如下所示:

./models/Aguy.php
./models/Pguy.php
./models/Zguy.php
./models/generated/BaseAguy.php
./models/generated/BasePguy.php
./models/generated/BaseZguy.php

因此,在{g'之前以字母开头的任何类名都会“崩溃”,因为generated文件夹中的Base *模型尚未加载(即.Aguy.php会“崩溃”但是Pguy.php和Zguy.php会工作)

generated文件夹中的所有Base *模型移到models目录中,部分解决了这个问题。现在任何以字母>开头的班级'b'可以工作(即现在从C到F开始的类不会崩溃,因为Base *模型之前加载了自动加载)。

为了完全解决问题,我将所有Base *模型放入一个名为_generated的目录中,因为_按字母顺序排在'a'之前。

目录结构现在看起来像:

./models/_generated/BaseAguy.php
./models/_generated/BasePguy.php
./models/_generated/BaseZguy.php
./models/Aguy.php
./models/Pguy.php
./models/Zguy.php

问题解决了 - 留下了一点头发。

感谢您的意见。

修改

可以在Why can't I create a Doctrine model named 'Album'

找到更优雅的解决方案

通过明确告诉Doctrine包含模型的目录的加载顺序

,可以解决问题
Doctrine::loadModels(array(APPPATH.'/models/generated', APPPATH.'/models'));

归功于Sander Versluys