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

2018年9月1日

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

前回書いていたブログの中で気付いたことがあります。srcの画像、分割した方が見やすいですね。。。笑

php初心者以前にブログ初心者なもので書き方も、もちろん自己流!!

なので自分のブログを見てくれている人には多大なるご不便をおかけしているのかもしれない。。多分。。いやかなりの確率で

これから長期にブログをやっていく中で、自分で気がついたことについては随時良い方向に向けて取り組みますので長い目で見てやって下さい<m(__)m>

というわけで切り替えて今日もフレームワークをやっていく。

前回からApplicationクラスについて取り組んでいるわけだが、今回やるところはそんなApplicationクラスの、いや、このフレームワークで最も肝と言える部分なので気合を入れ直してやっていきたいと思う。

run()メソッド

これがこのフレームワークにとっての肝であるrun()メソッドだ。

何故そう言えるのかと言うと、以前にやったと思うのだがこのフレームワークで作るアプリは、フロントコントローラによって全ての同ドメイン内のアクセスはindex.phpに集約される。

そのindex.phpのsrcがこれだ。

このsrcは少し先走って書いてあるので前回貼りつけたものとは違うものが書いてあるかもしれないが、index.phpではbootstrap.phpとMiniblogApplication.phpがそれぞれrequireで呼び出されている。

bootstrap.phpはオートロードに関する処理が記述されていることは以前に話したとおりだが、MiniblogApplication.phpというのはこのApplicationクラスの子クラスのことで、このフレームワークで作成されたアプリケーションの情報(ルーティング定義や、ディレクトリパス等)が記述されている。

それを呼び出している理由として、今回の内容のApplication.phpは抽象クラスなのでそのままインスタンス化はできない。Application.phpはその子クラスをインスタンス化することで初めてオブジェクトとなることができる。

つまりこのApplication.phpをインスタンス化する為に( 少しこの表現は語弊があるとは思うが )MiniblogApplication.phpをrequireで呼び出している。

そして子クラスをインスタンス化すると親クラスのメソッドが使用でききるのだが、MiniblogApplicationクラスをインスタンス化した直後、たった1つだけメソッドを呼び出している。

それがこのrun()メソッドだ!

では、具体的に何をするメソッドなのかということを簡単に言うと、

1・ユーザーのリクエスト( url )毎に、ルーティング定義配列からコントローラとアクションを特定。

2・特定したアクションメソッドを実行。

3・レスポンスとして返す。

ということをやるわけだ。はっきり言ってかなり複雑!!まぁあくまで、俺にとっては!!!

少し複雑なので区切りながら見てみよう。

リクエストから、コントローラーとアクションの特定

まずはコントローラーとアクションを特定する。これはRequestクラスのgetPathInfo()メソッドでユーザーのurlをまずは特定する。(もしgetPathInfo()メソッドがわからなければ以前の記事参照)

urlを取得したら、それをRouterクラスのresolve()メソッドに渡し、ルーティングパラメーターを作成する。ルーティングパラメーターは連想配列となっているのでその中のキーが「controller」及び「action」となっているものをそれぞれ「$controller」・「$action」に代入するのだ。

この時点でコントローラーとアクションの特定はできているのだが、もし指定されたurlがルーティング定義外だった場合については今後やっていく例外処理で対応する仕組みになっている。

 

特定したアクションメソッドの実行

ここからが超絶ややこしい。ややこしいので少し簡単させてもらう。

今コメントアウトしたところについては、アプリを実行するだけなら特に問題のない記述なので省かせてもらう。というわけなので実際は1行だけになる。

これは先ほど特定したcontroller・action・そしてルーティングパラメータ自体の3つを引数にして次回紹介予定のrunAction()メソッドを実行させるものだ。

このrunAction()メソッドではとりあえず、なんやかんやしてhtmlをレスポンスとして準備するとしておいてくれ!(なんやかんやについては次回記載します。)

 

レスポンスとして返す

これだけはわかりやすい。

2で記載したrunAction()メソッドで、なんやかんやしてレスポンスとしてhtmlを準備した後にResponseクラスのsend()メソッドを実行すると、準備されたhtmlが出力される。

 

というわけでおおまかな流れについてはこれで終了だ。

今回はrun()メソッドのみで終わってしまって申し訳ない気持ちでいっぱいなのだが、話しがあっっちゃこっちゃにいくこととなるので、今回はrun()メソッドの要点のみを伝える形とさせてもらった。ということで、次回はこの中身についてもう少し触れていくことにする。