Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
PHPでMVC第1回:前編
[go: Go Back, main page]

 SE/システムエンジニアのIT系就職/転職/派遣サイト システムエンジニアになるためのJava Linux資格の講座(スクール)IT Boost
ITエンジニアとして 働く 知る 学ぶ 買う 群れる
ゲストさん こんにちは
Java
.NET
PHP
プログラミング一般
DataBase
システム/サーバ構築
システム/サーバ運用
技術系一般知識
 
 
>IT技術情報>php>PHPでMVC第1回:前編
【連載 】PHPでMVC

第1回:前編

 
PHPは非常に簡単にWebアプリケーションを作成することができますが、その反面、保守性・再利用性の低いコードが記述されがちです。大規模Webアプリケーションを作成するための指針として、MVCアーキテクチャに基づく設計/実装がありますが、PHPではどう実現すればいいか、前編ではその指針と実装例の一部をご紹介いたします。また、J2EEパターンに含まれるDAOパターンの実現についてもご紹介しています。

松嶋祥文
株式会社アイティーブースト
2003/08/29
【著者プロフィール】
1973年生まれ。大学生のころからUNIX系アプリケーションの開発を始め、凸版印刷、株式会社インフォキャストを経て、現在に至る。主に Linux、Java、PHP、PostgreSQL、 MySQL など、オープンソース系ソフトウェアを利用したアプリケーションの開発に従事。 ITBoost 製品メールディーラーの主開発者
 

■実行環境
PHP4.3.2

【 目次 】
1.はじめに
2.ベースの検討
3.各パートの実装方針の検討
4.PHP で MVC するためのフレームワーク
5.request, session, resultの作成
6.Controllerの作成

1.はじめに

  オブジェクト指向の世界では、Webアプリケーション開発は「MVC」というモデルに従って作成するのが主流になっています。PHPでもオブジェクト指向で開発を行うことが可能ですが、よりお手軽な「ページ中心」の開発方法も取れるため、ついついそちらに流れてしまいがちです。本稿では、PHPでMVCを実現するとどういう形になるか、設計例と実装例をご紹介し、そのメリット/デメリットに関して考察を深めていただく目的で執筆しております。


2.ベースの検討

  Javaサーブレットの書籍などを見ていると、「MVCモデル」で作りましょう、といったことが書かれています。MVCが何かということについては、J2EE TIPS:MVCアーキテクチャ Googleで「MVCモデルとは?」などと検索して調べて頂くこととしまして、ここでは、PHPでMVCモデルを踏まえた設計/コーディングを行うことを検討し、簡単な実装例(実際に動作する形のコードではありません)を作成します。

    PHPでMVCモデルを実践する際に、まず気になることは、次の2点です。

  1. 各パート(M,V,C)間の遷移方法

  2. パート間でのデータの受け渡し方

  1.に関して、Javaサーブレットではforwardという処理を行いページの転送を行うのですが、PHPにはfoward相当の機能がありません。ですから、表示を行う PHP を include することを検討し、動的にincludeするファイルを変更するという方針を採ることにします。

  また、2.に関しては、適当なオブジェクトを使用して値を受け渡すという方針を採ることにします。オブジェクトには、一回のリクエストを処理している間存続する「request」と、セッションが存続している間、値を保存することができる「session」を用意することにしましょう。また、Modelが処理した結果を格納するためのオブジェクトとして、「result」も作成することにしましょう。



会員登録のメリット! ▼Java や Linux を体系的に学びましょう!▼
Stack*のアイティーブーストが、
新学習方式のカリキュラムを開発しました!
14700円から(*1)、Java や Linux を体系的に学べます!!
(*1 テキスト代のみの税込料金です)




3.各パートの実装方針の検討


  MVCの各パートについて、どのように作成するかを検討します。

Controller

  ここでは簡単のために、全てのリクエストは一つのコントローラで処理することにします。また、Controllerの実装は、クラスを用いて、情報のカプセル化を図ることにします(ただし、PHP4ではあまりちゃんとしたカプセル化/隠蔽はできないので、ここでは変数名の重複が起こりにくくする程度の意味しかありません)。
Controllerで行う処理は以下の通りとします。

    ・リクエストパラメータ「action」と「type」を用いて、行うべき処理を振り分ける。
    ・actionとtypeの値に対応するModelを実行する。
    ・表示に使用するページのファイル名を確定し、includeする。

Model

  こちらもクラスを用いて実装していきます。一つの機能ごとに一つのクラスを用意する形にします。そしてその処理の中で、処理の内容に応じて、resultオブジェクトに必要な情報を格納していきます。

  折角ですので、DAO(Data Access Object)パターンも適用していきましょう。DAOパターンとは、データベースなど、実際のデータの在り処にアクセスする全ての処理を一つのオブジェクトに割り当てて、データアクセス処理を抽象化するための設計パターンです(J2EEパターンの一つです)。ビジネスロジックとデータベースの間に一枚挟み込むような形になります。こうすることによって、データアクセスの方法が変わった時(使用するデータベースシステムが変わったとか、テーブルのスキーマが変わったような場合)にでも、DAOだけを書き換えればアプリケーション全体を変更しなくてもいいということになります。

  DAOと一緒に、VO(Value Object)というパターンも使用します。これは、データそのものを表現するためだけのオブジェクトで、値の受け渡しなどを行うときには、VOに各種データを「詰め込んで」受け渡します。多くの場合、データベースの1レコードと対応するような形で一つのオブジェクトが作成されます。


View

  ここは普通のPHPになります。あまり複雑なロジックを組み込まないように注意します。PHPにはJavaのカスタムタグのようなものはありませんので限界はあります。が、Viewに関係が無いロジックは組み込まないようにしましょう。

  なお、テンプレートを使用するという方法もあります。これを使えば、ロジックは削減できるかと思います。テンプレートを扱う仕組みについては多々ありますが、いくつかご紹介しておきます。

Smartyhttp://smarty.php.net/
patTemplatehttp://www.php-tools.de/
Fast Template http://www.thewebmasters.net/php/FastTemplate.phtml
PHP4 テンプレートクラスライブラリ改 http://www.daiwakantei.co.jp/pc/tmpl2sa.html

PEAR にもいくつかテンプレート関連のクラスが用意されています。


4.PHP で MVC するためのフレームワーク


  実は、こういったMVCに関する試みは既にいくつか行われており、フレームワークという形で提供されています。その一部をご紹介しておきます。



Phrame http://sourceforge.net/projects/phrame
props http://sourceforge.jp/forum/forum.php?forum_id=2561

5.request, session, resultの作成

  では、いよいよ具体的な実装を検討していきます。まず、request と session を作成しましょう。PHPは強力は配列(ハッシュ)を持っていますので、簡単に作成できそうです。

Request.php
<?php
class Request {
  var $params = Array();
  var $title = "";

  function Request() {
    // 通常のリクエストパラメータも同様に扱えるように
    if( is_array($_REQUEST) ) {
      foreach( $_REQUEST as $name => $value) {
        $this->add($name, $value);
      }
    }
  }

  function add($name, $data) {
    $this->params[$name] = $data;
  }

  function get($name) {
    return $this->param[$name];
  }

  function setTitle($title) {
    $this->title = $title;
  }

  function getTitle() {
    return $this->title;
  }
}
?>


  通常のリクエストパラメータも同じ様に扱えるように、コンストラクタでその取り込み処理を行っています。また、文書のタイトル文字列を扱うための属性とメソッドを用意しています。

sessionは、PHPのセッションとの連動が必要ですが、こちらも簡単に作成できます。

Session.php
<?php
class Session {
  function add($name, $data) {
    $_SESSION[$name] = $data;
  }
  function get($name) {
    return $_SESSION[$name];
  }
}
session_start();  // セッションをスタートさせる。
?>


  最後にModelの処理結果を格納するためのresultです。

Result.php
<?php
class Result {
  var $data = Array();
  function add($name, $data) {
    $this->data[$name] = $data;
  }
  function get($name) {
    return $this->data[$name];
  }
}
?>


  このクラスのオブジェクトは、Viewで表示する値を取り出すために使用しますが、このクラスにある程度のロジックを埋め込むことによって、Viewの記述が楽になったり、Viewに記述するロジックの量が減ることに繋がることが考えられます。

>>次のページへ

【 ページ 】 | 1 | 2 |

【 関連記事 】
PHPでMVC
第1回:前編
第2回:後編

ID(メールアドレス)
パスワード

次回以降自動ログインする
新規ユーザ登録
パスワード再発行
サイト内全文検索
スタックアスタリスクのサイトを検索します。検索には、Googleを利用しています。そのため、最新の情報で検索されない可能性があります。

簡単レンタルメールフォーム
300メガ1000円〜 XBitのレンタルサーバー
500メガ1995円〜 電話サポート/PostgreSQL/専用SSLなどにも対応!お客様のニーズを網羅したレンタルサーバ
ホームページ制作のアシストウェブ
STACK* 執筆の講師陣から習得する!! ITエンジニアスクール アイティブースト
統合メールサポートシステム 〜MailDealer(メールディーラー)〜
システム開発,IT教育 〜株式会社アイティーブースト(ITBoost)〜
  利用規約 お問い合わせ・ご意見 スタックアスタリスクについて 運営会社について 求人掲載お問合せ 
  レンタルサーバー ホスティング 専用サーバー 専用ホスティング メールフォーム ショッピングカート メール共有 ITエンジニア派遣 Linux講座 Java講座 メール配信 レンタルサーバー
メール管理・共有 顧客管理(CRM)もできるメール対応サポートシステムJAVA LINUX CISCO 技術者派遣 育成事業 システムエンジニアになるためのJava Linux資格の講座(スクール)