仕事で cakePHP をインストールしたレンタルサーバが変なエラーを出して動いてくれないっ!!

で、今までよく理解していなかった cake のフローを追っていく羽目に。せっかくなので、書いて残しておきます。(cake1.2.3.8166 を基にしていますが、他もあまり変らないかも)

dispatcher.php が基本なんですが、その辺はいくつかサイトを見つけたので楽しました。

で、libs/controller/controller.php と libs/view/view.php に関してはこちらを見つけました...

が、もうちょっと細かいところを調べてみたかったので、その辺をもう一度追ってみることにします。(いつもながら、の大体です。細かいことはカット)

ディスパッチャはコントローラをインヴォ~ク

まず、dispatcher は _invoke メソッドを使って、という所から。このメソッド(206~241行)はコントローラの名前(articles_controller など)といろいろなパラメータを受け取って、それをコントローラの constructClasses メソッド(436~462行)に渡します。このメソッドはコントローラが必要なモデルとコンポーネントを読み込みます。

そのあと、_invoke はいくつかごにょごにょして(コンポーネントを実行させる、コントローラの beforeFilter を行なう、リクエストされたアクションが存在しなかったら Missing Action の警告を出す、など)リクエストされたアクションを実行します。これは、controller.php の親 libs/object.php の dispatchMethod メソッド(112~130行)で行われます。これで、モデルといろいろな情報をやり取りしたり、コントローラのプロパティを設定、上書きしたわけです。

それで、AutoRender が true (デフォルト)であれば、コントローラの render メソッドが呼ばれることになるのです。

コントローラはビューをレンダ~

文法的にこういう表現が合っているかどうかは置いといて、本当は controller クラスの render メソッド(755~802行)は View クラスのインスタンスを作って、その render メソッドを呼ぶのです。

この View クラス、コンストラクタ(265~278行)でコントローラのプロパティを引き継ぎます。(引き継ぐプロパティは242~246行) controller でビューの render メソッドを呼ぶ時、引数がないのでどうやって渡しているのかと思いましたが、ここで引き継がれていました。

render メソッド(364~406行)ではさらに _render メソッド(643~691行)を呼び出します。このメソッドでビューファイルをバッファに読み込み、その内容を返します。ついでに出てきたビューの内容をキャッシュしておきます。

今度はレイアウトを render します。(388→418~460行) _render にレイアウトを渡すのですが、ページタイトルだのスクリプトタグ(javascript とか css)を加えるだの、ページの最後にデバッグ情報をつける(Core の Debug が2以上のとき)などの作業がされます。あと大切なのはさっきのビューファイルの内容を $content_for_layout に取り込んで再出力します。

か~んせ~い

そして、View の render はビューを Controller の render に渡して、Controller の render は dispatcher にビューを渡して、echo して出・来・上・が・り、なのでした。
(最後だいぶはしょった?)

で、結局エラーを吐いていたサーバは、言うこときくようになったかというと、まだなのでした。うまく行ったらまた書きます。