3

CakePHP 2.2 アプリでは、一部の内部構成のためにモデルでクラス定数を使用しています。次の問題が出てきました。

短縮版:

Cake の遅延クラス ローディングは、モデル クラスへの静的呼び出しによってトリガーされません。

コントローラ内のモデルへの最初のアクセスが

MyModel::SOME_CONST // fails

クラスは不明になります。クラスのインスタンスが以前に使用されていても問題ありません。

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

遅延読み込みの実装の詳細について知らない:

質問: これは修正不可能なものですか? もしそうなら、なぜですか?自分のアプリでそれを回避するにはどうすればよいですか (consts を関数にラップします)。それとも、静的アクセスでも機能するように遅延読み込みを改善する機会はありますか?

コード付きの長いバージョン:

さまざまなケースをテストするために、1 つのモデルと 1 つのコントローラーで小さなテスト アプリを作成しました。

モデル/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);
    }
}

ブラウザーから 3 つのコントローラー アクションにアクセスして、さまざまなケースをテストできるようになりました。

1) モデル定数へのアクセス (で/posts/constant):

エラー: クラス 'AppModel' が見つかりません

2) モデル変数へのアクセス (で/posts/variable):

'バー'

3) 変数の後で Model 定数にアクセスする (で/posts/variable):

'バー'

「ふー」

4

1 に答える 1

3

遅延読み込みは、通常のクラス呼び出しだけでなく、正しくアプローチした場合の静的呼び出しでも機能します。

正しくは、ファイルの先頭にあるすべての使用済みクラスを常に App::uses() する必要があることを意味します

モデル ファイル内の AppModel の場合:

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

class Post extends AppModel {}

詳細については、コア ファイルを参照してください。

于 2013-02-19T12:38:39.997 に答える