特集
2004/02/19 23:50:00 更新

全3回「WebプログラミングPHP言語入門」
特集:第3回 PHPを思うままに操れるようになる「MVC」と「Smarty」 (1/4)

同特集では、PHPについて簡単な解説を行った。最終回となる今回は、MVCモデルを理解して効率のよい開発手法を学ぶとともに、大規模サイトでも利用されるSmartyというテンプレートエンジンを紹介しよう。

はじめに

 今回は、PHPの基礎知識から一歩前進して、PHPを使ったWebアプリケーションを開発する際に役立つ情報を解説する。

 ここでの重要なキーワードは、“MVC”、“Smarty”、そして“デバッグ”の3つだ。

Webアプリケーションと脆弱性

 同連載第2回でも軽く触れた“MVC”について解説する前に、Webアプリケーションと脆弱性について触れておきたい。

 Webサイトや雑誌に掲載されている(CGIやPHPの)サンプルスクリプトを見た事がある方は、どのようなスクリプトが多かったのかを思い出してほしい。おおよそ次のような特徴を持ってはいなかっただろうか。

  • 画面毎(入力画面、確認画面、登録画面など)にスクリプトが存在する
  • 各画面への遷移は、それぞれのスクリプトを直接リクエストしている
  • 作者が意図していなかったスクリプトを直接リクエストできてしまう

 もし、あなたが利用しているWebサービスが上記の全ての特徴に当てはまるとしたら、そのアプリケーションは重大なセキュリティホールが存在する可能性を否定できないであろう。設計者の意図しない操作を許すという事は、設計者さえも知らない脆弱性が潜んでいる可能性があるという事になる。つまり、利用者と運営する企業のどちらにとっても、とても危険な状態なのだ。

 情報のデジタル化とインターネットの普及が急速に進んでおり、ITとは無縁だった業種でさえも、インターネットを利用した事業展開や業務の効率化を理由に、積極的にITを活用する事も珍しくない。反面、Webアプリケーションの脆弱性に関するニュースが連日巷を賑わせているが、これは一体何故なのだろうか。

 脆弱性を生む原因の一つとして考えられるのは、Webアプリケーションの挙動を設計者が把握しきれていなかったというケースが多いという点である。組織が大きく膨れ上がると、社長は会社の隅々まで目が行き届かなくなる……という話を聞いた事があるが、Webアプリケーションにも同じ事が言えるだろう。

 アプリケーションの規模が大きくなると、設計者が脆弱性に気付かない可能性も比例して大きくなる。そのため、全ての挙動を設計者が把握できるように設計しておく事が、アプリケーション開発には必要不可欠なのだ。

 セキュリティ対策がし易く、しかもWebアプリケーション全体を把握し易い。そんな都合の良い方法なんて存在しないとお思いだろうが、実は存在するのである。それが、今回解説する“MVC”だ。

MVCとは

 MVCとは、プログラムコードを、モデル(演算)、ビュー(表示)、コントローラ(制御)の3層に分けて設計する手法で、オンライン取引を行う主な業種(オンラインショッピング、オンラインバンキング、航空券・チケット予約など)では、必ずMVCを適用していると考えても差し支えは無いだろう。

fig1.gif

図1:MVCモデルの概念図

 Webブラウザ(クライアントPC)上に表示されたコンテンツ内に用意されているリンクやフォームに従って次の画面へと遷移(移動)する。この仕組みを応用し、サービス内容に従って設計したシステムが、一般的にWebアプリケーションと呼ばれている。

 では、Webアプリケーションの仕組みをMVCに当てはめて見てみよう。

 まず、ユーザーからのリクエスト情報を分析して動作を決定するコントローラが存在する。コントローラは、要求された内容に従い、実際に処理を担当するモデルに対して(漠然とした)指示を行う。具体的な処理は全てモデルに任せる事になる。

 次に、コントローラから指示を受けたモデルは、自分が担当する機能に関して必要な一切の処理を済ませ、その結果を保持する。モデルの役割は、演算やデータベース(またはファイルなど)の操作だけであり、担当以上の事は一切行わない。

 最後に、コントローラがビューに対して表示を指示する。その時、先ほどモデルが行った処理結果の情報がビューに渡される。ビューは、モデルの処理結果に応じた内容を表示するだけであり、担当以上の事は一切行わない。

 制御のコントローラ。演算・処理のモデル。表示のビュー。それぞれが、自分の専門分野に特化した構造で設計され、共有するデータ構造に一定のルールが設けられ、互いに干渉し合う事なく信頼し合うことで実現する仕組み。それがMVCである。

MVCのメリット

 銀行、航空会社、オンラインショッピングなど、数多くのWebサイトがMVCを適用しているからには、納得できるだけの理由が存在するはずである。では、どのようなメリットがあるのだろうか。

 筆者の経験では、MVCには少なくとも3つの大きなメリットが存在している。

 1つ目のメリットは、スクリプトのクオリティ向上に貢献する点だ。モデル、ビュー、コントローラという3つの処理に分割することで、1スクリプト辺りに必要な情報や技術が大幅に絞られていく。自分の担当箇所に関するスクリプトに注力できる事で、スクリプトの最適化やセキュリティ対策を十分に行うことが可能となる。

 2つ目のメリットは、不具合(バグ)の修正が容易である点だ。MVCは、それぞれの担当する処理だけに専念する構造であるため、連鎖的な不具合が発生するケースはごく稀である。この特徴が、不具合の原因特定や修正を容易にしている。

 3つ目のメリットは、クライアントの種類(Webブラウザや携帯電話など)に応じて表示方法を切り替えることが容易な点だ。例えば、iモードやEZWeb、Vodafone-live!など、携帯電話のキャリアによってマークアップ言語(HTML、CHTML、HDMLなど)が違う場合でも、修正する必要があるのはビューだけで済む。

 これらのメリットは、MVCを適用する事で比較的簡単に享受できる。折角の機会なので、MVCを意識したWebアプリケーションの開発を是非お勧めしたい。

MVCの特徴

 同連載第2回で、サンプルスクリプトsample4を作成する際にMVCを意識した設計を行った。下表は、MVCを適用したスクリプトの特徴をまとめたものである。MVCを適用したスクリプトの内容は、必ずと言って良いほど下表に合致しているはずだ。

表:MVCを適用したスクリプトの特徴
コントローラ要求されたアクションによって動作を切り替える作業がメインになるため、switch〜case文を多く使う。 動作バリエーションが多いケースでは、「メインコントローラ」と「サブコントローラ」の2段階に分けている事が多い。
モデル

特定の事柄(「カート」や「商品カタログ」など)に対して、処理内容や情報をカプセル化してクラス化する。 目的(「カートに商品を追加」など)に合わせてメソッドを実装する。メソッドの処理内容は一切隠蔽化されている。

ビューコントローラから渡されたモデルの処理結果に応じて、表示内容を切り替える機構を実装している。 何らかのテンプレートエンジンを用いて表示を行う。

 この表とsample4を照らし合わせてほしい。1つだけ、この特徴に合致していない箇所が存在することに気付くだろう。特徴に合致していないのは、テンプレートエンジンを用いずに自力で表示してしまっているビューだけである。

 次章は、テンプレートエンジンを用いたビューの作成方法について解説を行う。

      | 1 2 3 4 | 次のページ

[照井進吾,ITmedia]

Copyright © ITmedia, Inc. All Rights Reserved.