PHP フレームワーク Application.php 作成(3)

みなさんこんにちは!タカモリです。

前回からAppplicationクラスのrun()メソッドについて書いているのですが、このメソッドは中身にいろいろなメソッドを呼び出して作成されているので、なかなかややこしい作りになっています。以下に画像を貼っておきますね。

このrun()メソッドの説明については前回話したとおりなんですが、この中にあるrunAtion()メソッドがする処理の話しができていなかったと思うので、今回はこのrunAction()メソッドについてをやっていきたいと思います。

runAction()メソッド

ということで、今回もぼちぼちsrcコードを自己流で解釈していく。

前回の記事ではこのrunActionの記事でこのメソッドの説明みたいなものを軽くしてみたのだが、そのときには「なんやかんやしてレスポンスにhtmlを準備する」という風なさらっとした説明であったが、まさしくそのとおりだと思っているので、このメソッドの説明はそのまま流用する。

では実際にどのような処理をするのかというのをまとめてみると、

  1. 特定したコントローラ名をフレームワーク内から探せる形に変更
  2. 特定したコントローラファイル(クラス)の読み込み・インスタンス化
  3. 特定したコントローラクラスのアクションメソッドの実行
  4. アクションメソッドの実行結果をレスポンスに準備

というわけでsrcを貼ってみる。

特定したコントローラ名をフレームワーク内から探せる形に変更

このメソッドの引数には、run()メソッドで特定した「コントローラ名」・「アクション名」・「ルーティングパラメータ」がそれぞれ入ることとなる。

この特定された「コントローラ名」については現在全てが小文字の状態なので、それを「ucfirst()」関数により一文字目を大文字にしたうえ、後部に文字列で「Controller」の文字をつける。これによりクラスの入ったファイル名と、特定したコントローラ名が完全に一致する。

特定したコントローラファイル(クラス)の読込み・インスタンス化

クラスの入ったファイル名と特定したファイル名が一致したら、続いてそのクラスの読み込みと読み込んだクラスのインスタンス化を行う。これには後述する同クラス内の「findController()」メソッドを利用する。

特定したコントローラクラスのアクションメソッドの実行

特定したクラスがインスタンス化されたところで、コントローラクラスのメソッドをっさっそく実行する。

現在インスタンス化されているクラスはコントローラクラスの子クラスである為、これをインスタンス化すると親クラスのメソッドが利用可能になる。このrun()メソッドというのは特定したコントローラクラスの親クラスのメソッドだ。

なおコントローラクラスについてはまだ記事にしたことがないのだが、このrun()メソッドの引数に特定したアクション名を渡すことでそのアクションメソッドが実行される。

そのアクションによってはルーティングパラメータを必要とする処理を書きたい場合もある為、コントローラクラスに一度ルーティングパラメータを渡した後、更にルーティングパラメータはアクションメソッドに渡される。

なお!!返り値についてなのだが実はここでも「なんやかんやしてhtmlを$contentに返す」というような書き方しかできない。

これを説明する為には今後投稿予定のcontrollerクラスを書かないことには上手く説明できないので、割愛します。

アクションメソッドの実行結果をレスポンスに準備

これはなんやかんやして手に入ったhtmlをレスポンスクラスのsetContent()メソッドに渡し実行するものだが、setContent()メソッドはレスポンスクラスのプロパティに引数を代入するだけの関数なので、htmlをレスポンスクラスのプロパティに代入と言う方がわかりやすいのかもしれない。

 

ということでrunAction()メソッドの説明についてはこれで終わりたいと思うのだが、なんか忘れている気がする。。。

あ!そうそう!もう一個メソッド書かないと!

findController()メソッド

完全に忘れていた。。文字数見てそろそろかなぁと思っていたのだが。

このメソッドについては上の方で「クラスの読み込みと読み込んだクラスのインスタンス化を行う。」と説明させてもらった。処理としては流れ作業のような感じであるので簡単に説明したいと思う。

まず初めに「class_exists()」はそのクラスが定義済みであるかを調べる関数であり、「is_readable()」はそのファイルが読み込み可能か調べる関数だ。

このメソッドを俺流に直訳すると、

「引数で受け取ったコントローラクラスのオブジェクトを返すのに先立ち、もし特定したコントローラクラスが定義されていなければ、そのコントローラクラスのパスを作成してみて読み込み可能かどうかを調べてみる。読み込めないなら「false」を返し、読み込み可能なら「repuire_once」で読み込む。

読み込んだファイルに特定したコントローラクラスが定義されているのかを再度調べてみる。なければ「false」を返す。

なおオブジェクトを返す際にはこのクラス、つまりApllicationクラスの参照を引数で渡す。」

まぁざっとこんな感じになるのではないだろうか。

 

というわけでこれで今回書きたいことについては書き終わったので今日はこのへんで、まだ「なんやかんやしてhtmlを返す」みたいなところが残っているが、フレームワークの都合上と、自分自身もパーフェクトphpと同様の流れでやっていますのでご理解いただけると幸いです。

次回は例外の処理というのをやっていきたいと思います!!

なんやかんやのところはもうちょい後で!