3

在 CakePHP 2.2 应用程序中,我在模型中使用类常量进行一些内部配置。出现了以下问题。

简洁版本:

Cake 的延迟类加载不会由对 Model 类的静态调用触发。

如果第一次访问控制器中的模型是

MyModel::SOME_CONST // fails

班级将是未知的。如果之前使用过该类的任何实例,那很好:

$this->MyModel->something();
MyModel::SOME_CONST // works

不知道延迟加载实现的细节:

问题:这是无法解决的问题吗?如果是这样,为什么?那么我如何最好地在我的应用程序中解决它(将 const 包装在一个函数中)?或者是否有机会改进延迟加载,使其也适用于静态访问?

带有代码的长版本:

为了测试不同的情况,我制作了一个带有 1 个模型和 1 个控制器的小型测试 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)访问模型常量(at /posts/constant):

错误:找不到类“AppModel”

2)访问模型变量(at /posts/variable):

'酒吧'

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

'酒吧'

“富”

4

1 回答 1

3

如果您正确地接近它,则延迟加载适用于普通类调用以及静态调用。

正确的意思是,你总是必须 App::uses() 文件顶部所有使用的类

对于模型文件中的 AppModel:

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

class Post extends AppModel {}

有关详细信息,请参阅核心文件。

于 2013-02-19T12:38:39.997 回答