スクラッチで開発するときのPHPウェブアプリケーション構成案
はじめに
今回は、PHPとMySQLを使って、スクラッチでウェブアプリケーションを開発する場合に、効率的な設計について考えてみたいと思います。
非効率的なアプリケーション設計とは
ウェブアプリケーションを作る上で、最も非効率的なのは、1ページに必要な処理をそのまますべて記述することではないかと思います。
ウェブアプリケーションの動作を大きく3つのフローでとらえると、概ね以下のようになります。
- ①データベースからデータを取り出す
- ②取り出したデータを操作する
- ③データを表示する
しかし、これをすべて1ページに詰め込むような設計をしてしまうと、後にプログラムを見るのも嫌になります。
それは、同じ処理が複数のファイルに別々に存在し、ひとつの機能を見直すときにそれらすべてを修正しないといけない、また、修正を繰り返すうちに、同じ機能であるはずの記述が微妙に違ってきたりする。
ひとつの修正をする度にすべてを見直さなければならなくなるわけですから、修正に時間もかかりますし、不具合も多くなるわけです。
できれば手をつけたくないという状況に陥るわけですね。
ですから、プログラムを作る上で、同じ機能はできる限りひとつにまとめて再利用可能にするという考え方は重要なわけです。
MVCモデル
ウェブアプリケーションの設計のモデルとして、MVCモデルというものがあります。
MVCはそれぞれ以下を表します。
- ・Model(モデル)
- ・View(ビュー)
- ・Controller(コントローラー)
これは、必要な機能を共通化し、再利用可能とする上で非常に便利な枠組みです。
このMVCを、先ほどのウェブアプリケーションのフローに重ねると、
- ①データベースからデータを取り出す -> Model
- ②取り出したデータを操作する -> Controller
- ③データを表示する -> View
上記のように対応付けられます。
これはCakePHPをはじめとする、多くのフレームワークで取り入れられている概念です。
直感的にはわかりづらいですが、実際にスクラッチでウェブアプリケーションを作って試行錯誤をするとここに行き着きます。
スクラッチでアプリケーションを作る場合のフレームワークを考える
一番手っ取り早いのは、既に運用実績のあるフレームワークを理解し、利用することですが、こういったフレームワークは自分で好きにカスタマイズできなかったり、バージョンアップ時の挙動を予測できなかったりと、中途半端な理解のまま使うと不便なところもあります。
そこで、ここではスクラッチで作る、シンプルなMVCモデルのアプリケーション構成を考えてみたいと思います。
アプリケーション構成案
以下は、トップページにデータを表示するだけの簡単なウェブアプリケーションの構成案です。
・index.php(トップページ)
│
├─ models
│ └─ database.php(SQL)
│
├─ controllers
│ └─ indexCont.php(処理)
│
├─ elements
│ ├─ header.php(共通ヘッダー)
│ └─ footer.php(共通フッター)
│
├─ css
│ ├─ common.css(共通CSS)
│ └─ index.css(トップページCSS)
│
├─ js
│ ├─ common.js(共通JS)
│ └─ index.js(トップページJS)
│
└─ images(画像関連)
最も上位のディレクトリにあるのが、アクセス時に最初に読み込まれるページファイル(ビュー)となります。
では、上記構成をもとに、index.php、indexCont.phpのコードを検討します。
index.php
トップページを表示するビューファイルです。コントローラー内で取得されたユーザー名のコンテンツ情報を表示します。
<?php
require_once('./models/database.php'); // モデル読み込み
require_once('./controllers/indexCont.php'); // コントローラー読み込み
require_once('./elements/header.php'); // ヘッダー読み込み
?>
echo $contents['name']; // ユーザー名を表示
<?php
require_once('./elements/footer.php'); // フッター読み込み
?>
indexCont.php
データベースファイルから取得したユーザー名をセットし、ヘッダー情報もセットします。
機能を分割して別ファイルとして切り出すことで、あらゆるページのファイルから利用が可能となり、修正の際も共通ファイルひとつを修正すればよいため保守性にも優れているのがわかると思います。
<?php
/* Viewで使う配列用意 */
$header = array(); // ヘッダー用
$contents = array(); // コンテンツ用
/* データベースファイルの読み込み */
require_once('./database.php');
/* データの取得 */
$contents['name'] = getUserName(1); // 指定のIDのユーザー名を取得する関数とする
/* ヘッダー情報の設定(header.php内で使用) */
$header = array('title' => 'ページタイトル',
'keywords' => 'キーワード',
'description' => '紹介文',
'js' => './js/index.js',
'css' => './css/index.css',
'index' => true // 検索エンジンの公開制御用
);
?>
db.php、header.php、footer.php、その他ファイルの中身についてはご想像できるかと思いますので、ここでは割愛します。
さいごに
実際利用する場合には、セッションを使ったり、ログイン処理を入れたり、設定ファイルを別に用意したりと、いくつかファイルを付け加えることで対応が可能かと思います。
ウェブアプリケーションを一から組み上げる場合の参考になれば幸いです。