我正在使用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 - 除了类和变量起始字母。
想法?
(免责声明:我是金发女郎)
答案 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'));