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
):
2) モデル変数へのアクセス (でエラー: クラス 'AppModel' が見つかりません
/posts/variable
):
3) 変数の後で Model 定数にアクセスする (で'バー'
/posts/variable
):
'バー'
「ふー」