CakePHP延迟加载失败,静态访问类常量

时间:2013-02-19 12:28:26

标签: cakephp static lazy-loading

在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):
  

错误:未找到“AppModel”类

2)访问Model变量(/posts/variable):
  

'酒吧'

3)在变量(/posts/variable)之后访问模型常量:
  

'酒吧'

     

'富'

1 个答案:

答案 0 :(得分:3)

lazyloading与正常的类调用以及静态调用一起工作,如果你正确接近它。

正确地表示,您始终必须在文件顶部使用App :: uses()所有使用的类

表示模型文件中的AppModel:

App::uses('AppModel', 'Model');

class Post extends AppModel {}

查看核心文件了解详情。