MVCフレームワークとは

MVCフレームワーク

ここまで一通りPHPの学習を行ってきましたので、より大きな規模の開発にも使える課題に取り組み、学習しましょう。そのためにMVCモデルに基づいたフレームワークの開発について学びます。最近では大規模開発の場合、フレームワークを使用することが多く、様々なフレームワークが多くの言語で公開されています。
まずはMVCとは、フレームワークとはどんなものなのか確認してから開発について学びましょう。

フレームワークは機能がまとめられた便利なもの

基本的にPHPプログラムはまっさらな何も書かれていない状態からプログラミングしていきます。しかし、例えばWebサービスを提供するアプリケーションを開発するにあたり、ユーザーからのリクエスト受信やデーターベース操作、サーバー側から結果を表示する画面の送信などといった処理は、たいていのアプリケーションで必要とする基本的な処理です。
このような基本的な処理を毎回、プログラムを記述して作成するのは無駄なコストがかかりますし、面倒なことです。そこで、Webアプリで使用する、作成する基本機能をまとめておいたものを先に作っておき、それを基準に機能を付加するよう開発します。そうすれば、基本的な機能を書く必要がなく、アプリケーション独自の機能の開発に専念できます。
このようにWebアプリが使用する基本機能をまとめたものがフレームワークです。

フレームワークの中身はどうなっているのか

フレームワークの中身は、機能別に作成したクラスです。フレームワークでは基本的な機能を用途別にクラスで用意しておきます。これらのクラスを継承、オーバーライドし独自の機能を実装します。
オブジェクト指向の手法を用いることによりフレームワークの利用者が独自の機能を取り込んで、独自のアプリケーションを作り出せるようにしています。

例えば複数のプログラマーで1つのアプリケーションを開発する場合、それぞれが好き勝手にコーディングし、開発していくと統一感がなくなりバグが生じる可能性も高くなります。人数が多ければ多いほどムラが大きくできてしまいます。クラスの設計も人それぞれ考え方があります。フレームワークでは、クラスの命名規則やメソッド名の指定、インスタンス化のタイミングなどといったルールが定められています。このようなフレームワークのルールに従いながら開発すれば楽になりますし、ムラが出ることも極力減らせます。

フレームワークはWebアプリの土台となり、オブジェクト指向に基づいて作成されます。なので、継承などといった仕組みはわかるけど用途がわからないとしても、フレームワークを作ることで理解できると思います。

MVCとは必要な基本機能を3つの処理に分割する手法

フレークワークの概要について説明しましたので、次にMVCについて説明します。
MVCとはプログラミングの手法の一つであり、「Model」、「View」、「Controller」のそれぞれの頭文字を取った略称で、Webアプリケーションに必要な基本機能を3つの処理に分割して実装する手法です。3つの構成要素の説明は下記の通りです。

Modelデータアクセスを担当しており、メインの処理を行う部分。ビジネスロジックとも呼ばれます。
View処理結果を画面に表示する担当。
Controllerクライアントからのリクエストを受け取り、ModelやViewに処理を振り分ける中継的な担当。

例えばクライアントが商品名を入力して検索のリクエストを送ったとしますと、Controllerはリクエスト情報を基にModelに処理を依頼します。Modelはデータと連携した処理を行い、Controllerに返します。Controllerは返された処理結果のデータをViewに渡し、Viewはデータを基にHTMLを生成して表示します。基本的にはこの流れで一連の処理を行います。

フレームワークでは基本的にクラスを定義して処理を実装します。フレームワークを利用する側はフレームワークのクラスを継承し、独自の機能を実装します。このサイトの学習ではあえてMVCの仕組みを1から作成していき、理解を深めましょう。

MVCについてそれぞれもう少し詳しく理解する

MVCではオブジェクト指向に基づいてアプリケーションの骨格を組み立てます。先述の通り、それぞれ全てクラスで定義していきます。

Controller

コントローラークラスには、アクションを実行するためのメソッドを定義します。このアクションという言葉はよく使うので覚えておいてください。MVCでは処理を実行することをアクションというのです。
Webアプリケーションにはデータベースに対するデータの登録などと行ったモデルクラスに対する処理や、処理結果を基に画面を生成する際のビュークラスに対する処理がありますが、これらの処理の総称としてアクションという用語を使います。ユーザーからのリクエストに対してアクションを実行するというわけです。

アクションはたくさんあるわけですから、「○○アクション」と使います。データ登録を行うregisterアクションの実体はregisterAcrionという名前のメソッドで定義します。

コントローラークラスにはアクションを実行するためのメソッドを定義するのですが、どのアクションを実行するかを決定するメソッドも用意します。そうすることでコントローラークラスに処理を委ねれば、その時適切なアクションが呼び出され実行されます。司令塔的な役割ですね。

Model

モデルクラスの処理のことをビジネスロジックと呼び、Webアプリケーションにおけるビジネスロジックとはデータベース操作にあたります。コントローラーのアクションから呼ばれてSQL文を発行し、データベース操作を行う役割です。

View

Webアプリケーションにおける画面、ユーザーインターフェースの部分がビューです。処理結果を反映させたHTMLを生成し表示します。同じビューを使用した場合でも動的に内容を変更し、反映させて生成しなければならないのでHTMLの中にPHPなどのプログラムを埋め込んで、モデルで得たデータを画面に出力します。

コントローラーがモデルとビューを制御する

コントローラーがリクエストに直結し、処理の原点となります。
コントローラーに全てのロジックを詰め込んでコントローラーで動かせますが、それは好ましくありません。
コントローラーはリクエストに直結するものですので、リクエストに使われるURLが変更になってもビジネスロジックに影響を与えるべきではないですし、ユーザーインターフェースに変更があってもビジネスロジックに影響を与えるのはダメですよね。データベースの構造を変更した時でもビューに影響があるのも好ましくありませんよね。
なので、MVCはきちんと切り分ける必要があります。

M・V・C以外に必要なもの

MVCフレームワークで開発されたWebアプリケーションは基本的にURLで指定されたファイルから処理することがスタートです。

ルーティングで実行すべきコントローラーとアクションを決定

MVCはそもそもWebアプリのビジネスロジックのためのものなのです。なのでMVCではルーティングと呼ばれる方法を使って、実行すべきアクションを呼び出します。MVCのルーティングではリクエストされたURLに基づいて実行すべきアプリケーションを決定します。特別なURLを使ってアクセスするのではなく、例えば「http://hogehogeee.com/home」というようなURLにアクセスした時、ドメイン 以下のパスが「home」であればhomeコントローラーのindexアクションを実行するという取り決めをしておきます。先ほどのURLがリクエストされたらルーティングによって判別し、処理を行うコントローラーである「homeコントローラー」と実行するアクションである「indexアクション」という情報を生成し、コントローラー本体に渡します。

アプリケーションクラスというアプリケーション本体

本体となるアプリケーションクラスでは以下のことを行います。

  • ルーティングを実行して実行すべきコントローラーとアクションを特定
  • コントローラークラスをインスタンス化し、実行すべきアクション名を渡す
  • アクションの実行結果としてビューが生成したユーザーインターフェースをクライアントに送信する

全ての処理の起点となるフロントコントローラー

アクションを実行するコントローラーとは別に、全てのリクエストを一手に引き受けるコントローラーです。これはApache側のバーチャルホストという機能で設定します。例えばindex.phpという名前のフロントコントローラーをドキュメントルート直下に置き、http://hogehogeee.com/hogeというリクエストがあれば、http://hogehogee.com/のドキュメントルートにあるindex.htmlにアクセスするようにします。あとはindex.htmlがアプリケーションクラスを呼び出し、ルーティング→アクションという流れで処理を行います。

MVCフレームワークの構造

これからディレクトリを作成しながらMVCフレームワークの構造を確認しましょう。

画像のような構造でMVCフレームワークのファイルを保存するディレクトリを作成してください。XAMPPで作成しますので、htdocsの中にsampleMVCディレクトリを作成して、続けて配下のディレクトリとファイルを作成してください。ファイルの中身はまだ記述しなくていいです。名前は独自に命名しても良いです。

sampleMVCディレクトリ
mvcディレクトリ
pub_docsディレクトリ

準備ができたら次回からファイルの中身を記述してフレームワークを作成していきます。

コメント

タイトルとURLをコピーしました