在CakePHP 2.2应用程序中,我在模型中使用类常量进行一些内部配置。出现了以下问题。
对Model类的静态调用不会触发Cake的延迟类加载。
如果首次访问控制器中的模型
MyModel::SOME_CONST // fails
该课程将是未知的。如果之前使用过该类的任何实例,那很好:
$this->MyModel->something();
MyModel::SOME_CONST // works
不知道延迟加载实现的细节:
问题:这是不可能解决的问题?如果是这样,为什么?我如何在我的应用程序中自己最好地解决它(在函数中包装consts)?或者是否有机会改善延迟加载,以便它也可以使用静态访问?
为了测试不同的情况,我用一个Model和一个Controller做了一个小测试App:
型号/ post.php中:<?php
class Post extends AppModel {
public $useTable = false; // Don't bother with a DB
const FOO = "foo";
public $bar = "bar";
}
控制器/ PostsController.php:
<?php
class PostsController extends AppController {
public function constant() {
debug(Post::FOO);
}
public function variable() {
debug($this->Post->bar);
}
public function variableFirst() {
debug($this->Post->bar);
debug(Post::FOO);
}
}
通过浏览器访问三个控制器操作,现在可以测试不同的情况。
1)访问Model常量(/posts/constant
):
2)访问Model变量(错误:未找到“AppModel”类
/posts/variable
):
3)在变量('酒吧'
/posts/variable
)之后访问模型常量:
'酒吧'
'富'
答案 0 :(得分:3)
lazyloading与正常的类调用以及静态调用一起工作,如果你正确接近它。
正确地表示,您始终必须在文件顶部使用App :: uses()所有使用的类
表示模型文件中的AppModel:
App::uses('AppModel', 'Model');
class Post extends AppModel {}
查看核心文件了解详情。