(id:studio-m)この広告は、90日以上更新していないブログに表示しています。phpSecurityComponentのチェックにかかってにっちもさっちもいかなくなったんだが、そもそも基本的な動作フローを理解していないのでどこから手を付けていいのか分からない。いうわけで、コンポーネントが読み込まれる仕組みを調べてみた。対象バージョンは1.3.6だけど、2011/05/19時点のgithubのmasterを見てもこのあたりは変わっていないらしい。■Dispatcherから始めるコケたところでdebug_backtraceを取って、そこからさかのぼってみる。Dispatcher(cake/dispatcher.php)のdispatchメソッドの最後で$this->_invokeが呼ばれていて、ここから読み始めることにした。アクションメソッドを呼び出す前に以下の処理があり、ここでコンポーネントの読み込みと初期化を行っているようだ。$controller->startupProcess();■Controllerを読むController(cake/libs/controller/controller.php)の中を見る。Controllerの中で定義されているComponent関連と思われるメンバ変数の定義。array('Session');componentsとComponentは別物という扱いのようだ。componentsに列挙されたコンポーネントを回して、それぞれがコールバックを叩くというイメージを持っていたが、どうやら違うらしい。Componentがstringということは、callbackを持てるコンポーネントは1つだけで、その名前を入れるとかだろうか。$this->Componentはコンストラクタの中で以下のように初期化している。string」ってコメントの記述はドキュメントバグでしょうか。気を取り直して、Dispatcherの_invokeで呼ばれている処理をそれぞれ追ってみる。constructClasses()から。$this->Component->init($this);してるだけ。startupProcess()の全処理。}まとめると、beforeFilterで特別なことをしなければ、以下のフローで処理されていることになる。*/という、やっぱり怪しいことが書いてある。SecurityComponentiを確認してみると、Componentを継承しておらず、Componentと同じくObjectを継承している。Componentクラスはコンポーネントの基底クラスではなく、Controllerがcomponentsを管理する際に必要な処理をまとめるための物らしい。こんなの絶対おかしいよ。●init(&$controller)controllerのcomponentsで指定されたコンポーネントを順次ロードする。実際の処理は_loadComponents()が受け持っており、このあたりの実装は相当気持ち悪い。コンポーネントからコンポーネントを呼ぶことにも対応しており、controllerから直接呼ばれたコンポーネントは$this->_primary[]に入っていく。$this->_primaryが何者かというと、こういうことらしい。array();」で初期化しているが気にしてはいけない。●initialize(&$controller)各コンポーネントのinitialize()を呼ぶ。&$controller)$this->_primaryに入っているコンポーネントで$callbackに該当するメソッドが定義されていれば、それを順に呼んでいく。今追っているフローだと、callbackはstartupなので、各コンポーネントのstartupメソッドを呼んでいる。前述の「componentsに列挙されたコンポーネントを回して、それぞれがコールバックを叩く」というイメージは間違ってなくて、それを担当するのがComponentだったということ。した流れは追えたので、今日はここまで。releasedフリーランスという働き方cobblerでRHEL6系のリポジトリをミラー出来ない時の対処法PHPのnullはハマりポイントになりかねない月別アーカイブはてなブログをはじめよう!studio-mさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。