PHP

パーフェクトPHPのフレームワークを理解する

こんにちは、ともです。

今回はパーフェクトPHPの第7章で学ぶオリジナルフレームワークについて概念的な理解を深めて行きます。

Laravelというフレームワークから入ったボクには、

フレームワークの内部を知りたい。

という思いがありまして、このパーフェクトPHPの第7章は最適な本です。

現在勉強中のボクではありますが、パーフェクトPHPで作成するフレームワークについて僕の理解を書き記すことで、この章で詰まった方の何らかの助けになればと思い書きます。

そもそもWebアプリってなんなんだっていう所から書き始めます。間違ってたら教えて下さい!

リクエストとレスポンス

Webページの描画にはリクエストとレスポンスという大きな処理の流れが存在します。

あるページを見たい場合(リクエスト)、そのページのファイル(HTML)をサーバは返します(レスポンス)。

このレスポンスに相当するのは、今あなたのブラウザに写っている描画内容です。

この描画内容をサーバサイドで作成し、それをレスポンスとして返しているからブラウジングできているのです。

PHPはサーバサイドの処理を担う言語であり、この描画内容(レスポンス)を作成することが目的です。

ですので、PHPを書いているということはレスポンスとして描画内容を作成したいがために書いているのです。

  • PHPはサーバサイドの言語であり、レスポンスの作成を担う

PHPがやることって

PHPの役目はサーバ側で動的に表示内容を作成することです。

Twitterで考えますと、自身のプロフィール画像や自己紹介の内容、投稿内容といったものが動的に埋め込まれていますよね。

HTMLとCSSだけで静的なサイトを作成されたことがある人なら、PHPなどのサーバサイドの言語を利用すれば動的なページが作成できることは理解が早いのではないでしょうか。

ただHTMLとCSSだけだと、そのような時と場合に応じてページを変更するようなことはできません。

PHPを利用して動的に表示内容の作成を行うことで、必要な情報(プロフィール画像や自己紹介内容、投稿内容)をページに埋め込んでいるのです。

  • 動的な描画内容の作成は、必要な情報をページへの埋め込む処理である

フレームワークとは

今までの話で、PHPにより必要な情報ページへの埋め込んでいることが分かって頂けたと思います。

ではここで、パーフェクトPHP第7章で学ぶフレームワークとは何者なのしょうか。

フレームワークとは「枠組み」や「骨組み」といった意味です。

フレームワークとは別にプログラミングだけの話ではありません。コンサル業界の就活を受けた方ならフレームワークという言葉を聞いたことあるのではないでしょうか。

ある課題を解決するときに、その課題を解決する思考方法の骨組みとして作成しておけば、同じような課題に出会った場合に、同じ思考方法を当てはめれば解決できますよね。

つまりは課題解決の枠組みという訳です。

サーバサイドでの課題

PHPで動的に描画内容を作成する場合の課題とは何なのでしょうか。これはパーフェクトPHP第6章に書かれています。

PHPで動的に描画内容を作成する場合の課題とはロジックとビューを切り分け、仕組み化したいということです。

ロジックとは、データベースから情報を取得するという処理。ビューとはHTMLとCSSのことを指すとします。

ロジックとビューが1つのファイルに書かれていると、見通しが悪くなり管理が大変になります。

また、リクエストに対する処理の流れを仕組み化できそうです。

URLに対する処理や、セッションに関する処理など、機能ごと分担させ、ベルトコンベアを流れるようにリクエストを処理するという仕組みができそうです。

MVCとは

そのようなロジックとビューを切り分け、仕組み化したいという課題を解決するための1つのフレームワークにMVCフレームワークというものが存在します。

パーフェクトPHPで作成するフレームワークも、MVCフレームワークというものに相当します。

ですので、MVCとは何かを簡単にでも理解しておくことが、この7章を読み解く上で重要です。

MVCフレームワークについて、僕も初めはよくわかっていませんでした。

MVCとは、Model View Controllerの頭文字をとったものです。

Model 具体的な処理の内容。描画に必要なものを準備
View ユーザが見る描画内容
Controller ModelとViewとを繋ぎ合わせ、ユーザに届ける

サーバサイドで動的にコンテンツを作成する事は、必要な情報を準備しページへの埋め込む処理であることは前述しました。

必要な情報を準備する処理をModelに記述し、描画内容の作成する処理をViewに記述し、ModelとViewの架け橋をControllerに記述する、という風に役割分担を分けます。

MVCの役割分担により、ロジックとビューを分離し、サーバサイドでの動的な描画内容の作成手順の仕組み化を実現しようという訳です。

仕組み化する部分に思想があるのかな?

設計思想という言葉を聞いたことがありますよね。

以下は予想なんですが、

設計思想とはフレームワークの作成者が作成する際に、どのように課題を解決しようと考えたのか、という頭の中の構想なんだと思います。

例えば、こういう風に役割分担させよう!っていうのも1つの思想なんでしょうね。

となると、そのフレームワークの利用者は設計思想に従ってコードを書くことが筋ですよね。

コントローラーはモデルとビューの橋渡しですから、コントローラにロジックを書くべきではない。みたいな感じで。

ただ、初心者にとってその思想を汲み取ることは困難なんですよね。使うことで精一杯ですから。

ただ、設計思想に沿ってコードを書くぞ!という気持ちは持っておきたいし、どういう考えで設計されたんだろう?と考えながら利用したいですね。

パーフェクトPHPで作成するフレームワーク

とりあえす、フローとそれに対する簡単な説明を書きました。ざっと読んで頂くと仕組み化を理解できるかもしれません。

bootstrap.php

bootstrap.phpはオートロードの役割を担っています。

ClassLoader.phpを読み込むことにより、models/とviews/のファイルをオートロードしています。

オートロードの実現にはspl_auto_loadという機能が利用されています。

spl_auto_loadにより、インスタンスが生成出来ない場合に実行するメソッドを登録しておくことが出来ます。

ここで、newした場合にmodels/とviews/をロード(require)するように設定しておくことで、ファイルが増える度にrequireをする手間を省いています。(オートロード)

詳細については下記の記事に書きました。

Application

アプリケーションの立ち上げ用の抽象クラスです。

  1. 初期化
  2. Requestを受けてから、Responseを返すまでの処理の流れを実行
  3. 開発者がルーティングを登録

このApplication抽象クラスを継承し、抽象メソッドに下記のメソッドを実装します。

  1. ルートディレクトリの設定
  2. ルーティングの設定(registerRoutes)

アプリケーションの立ち上げクラスであることがわかると思います。

RequestとRouter

Request

RequestクラスはURLに関する処理をまとめたクラスです。

このフレームワークではURLを

  1. Base_URL
  2. Path_INFO

に分解しますが、URLの分解処理をRequestクラスが担当しています。

Router

RouterクラスはRequestクラスが分解したURLと、Application抽象クラスの抽象メソッドであるregisterRoutesで設定したルーティングとの対応付けを行います。

あるURLが来た場合、このルーティングに登録されたルーティングであれば、対応したコントローラのアクションを実行します。

  • ReqestでURLを分解
  • Routerでコントローラとアクションを特定し実行

Controller

サーバサイドで動的にレスポンスを作成することは、DBから取得したデータ等を適宜Viewに埋め込むことだと前述しました。

ControllerクラスではDBからのデータ取得とViewへの埋め込みの橋渡しを行なっています。

RouterクラスによりControllerとアクションが特定されました。

橋渡しを行なっている場所は、このControllerクラスのアクションで行われます。

DbManagerとDbRepository

DbManager

DbManagerではデータベース周りの管理を担当しています。

リポジトリ名からPDOでアクセスするテーブル先とDbRepositoryに対応つけを行います。

DbRepository

DbRepositoryはテーブルに関する管理を行います。

DbMangerによって、テーブルとDbRepositoryが対応つけられました。

DbRepositoryクラスはテーブルからのデータ取得等のCRUDを担当しています。

MVCでいうModelの部分がDbRepositoryに対応しています

SessionとView

Session

Sessionはセッションの管理と認証の管理を担当しています。

セッションへの情報の格納や、認証済みかどうかの判定を行なっています。

認証済みでなければ見れないページはこのセッションクラスに実装された認証済みかの判定メソッドが利用できます。

View

Viewはviews/配下のviewファイルの読み込みと、DbRepositoryから取得した動的なデータを格納した変数を組み合わせる事となります。

これを実現するためにアフターバッファリングという処理が利用されています。

これによりレスポンスに返すファイルの作成が完了します。

Response

ResponseはHTTPレスポンスを返すことを担当しています。

これまでの処理でサーバサイドレンダリングにより、必要なデータを埋め込んだViewファイルを作成することができました。

次は、これをHTTPレスポンスで返すことになります。header関数でステータスコードを設定し、作成したViewファイルを出力します。

ソースコード

作成したアプリケーションをGitHubにあげました。

理解するのに1ヶ月ほどかかりましたがちゃんとMini-blogアプリケーションを作り切ることができました。

この記事を読んで頂いた方は、パーフェクトPHPに取り組んでいる方が多いと思います。参考になれば幸いです。

まとめ

大まかにフレームワークの流れが理解できました。

Laravelを触っているだけでは理解できない深い部分を少し垣間見れた感じがします。

パーフェクトPHP7章以降の7章で作成したフレームワークを利用したアプリケーションの作成もできましたらブログにまとめたいと思います。