GAE+PHP/Rubyで拓く新世界

第4回 PHPでGAE上に社員検索アプリを作る

萩原 巧
リトルソフト株式会社

中越 智哉
株式会社ナレッジエックス

2010/3/18

GAE on PHPにおけるSmartyの連携方法

 リトルソフトでは、SmartyおよびQuercusを独自にエンハンスして、GAE上でのテンプレートエンジン使用を実現しました。PHP4Gでは、Smartyがコンパイルを行ったコンパイル済みソースを、BigTable上に保存、展開します。

 保存部分は、Smartyのコンパイル部分やファイル保存部分を独自に書き換えて、コンパイル済みソースをGAEのBigTable上に書き込めるように修正しました。展開部分では、BigTableから読み込んだコンパイル済みソースを直接PHPプロセッサに通す独自PHP命令文を新規作成しました。

 BigTableに書き込まれたコンパイル済みソースを読み込むこと自体は、書き込み同様、容易に実現できました。しかし、それをPHPプロセッサに通す部分について、それを実現する方法がなかったのです。

 具体的にいうと、PHPのInclude命令文などの外部リソースの読み込みは、その外部リソースが実在することが絶対的な条件なので、BigTableからコンパイル済みソースが読み込めただけでは、そのソースをPHPプロセッサに通す(PHPソースとして実行する)ことはできません。

 なお、新規に追加した独自命令文は、Smarty内部処理でcallされるため、開発者がそれを意識する必要はありません。

 Smartyの実際のソースを見てみましょう。

●テンプレート側(sample.tpl)
<html>
    <head>
        <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
        <title>Smartyサンプル</title>
    </head>
    body>
        {$value}
    </body>
</html>

 テンプレートでは、{$value}と定義していますが、これは、変数valueの内容を表示させるsmartyの記述ルールです。

●PHP側(sample.php)
<html>
    <head>
        <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
        <title>Smartyサンプル</title>
    </head>
    body>
        {$value}
    </body>
</html>
GAE環境におけるドキュメントルートディレクトリ($_SERVER["DOCUMENT_ROOT"])は、[projectRoot]/warになります。

画面1 helloと表示

 以上のように、テンプレート側、php側ともに、GAE環境であることを意識せず、いままでと同様の手順で、Smatyを使用できました。

Pear::DBを活用したデータアクセス

 Pear::DBを活用することにより、データベースの差異をフレームワーク層(Pear::DB)が吸収するので、プログラマーはそれを意識することなく、統一的な手段でデータベースへのアクセスができます。

 具体的には、Pear::DBのデータアクセス基底クラスのDB_commonを継承し、SQL4Gへのインターフェイスの役割を行う子クラスを新規作成します。SQL4Gへのアクセスは、そのクラスを通じてデータの取得、永続化を行います。

 実際のPHPソースを見てみましょう。

●dbaccess.php
<?php
    // Pear::DBの基底ソースをincludeします。
    include $_SERVER["DOCUMENT_ROOT"]."/phplibs/inc.php";
    include_once "DB.php";

    // 接続情報の配列を作成。そのときphptypeにはSQL4Gと指定します。
    $dsn = array(
        'phptype' => 'SQL4G',
        'database' => 'DB1',
        'user' => 'sa',
        'password' => 'sa'
    );

    // sql4gへ接続
    $db = DB::connect($dsn);

    // エラーがないか確認
    if (PEAR::isError($db)) {
        die($db->getMessage());
    }

    // SQL (SELECT DEPT_NAME FROM M_DEPT) を発行し、結果セットを設定
    $ret = $db->query("SELECT DEPT_NAME FROM M_DEPT;");

    // 結果セットの件数分、カラム[DEPT_NAME]を出力
    while ($ret->fetchInto($row,DB_FETCHMODE_ASSOC)) {
    print($row["DEPT_NAME"].'<br>');
    }

    // sql4gから切断
    $db->disconnect();
?>
画面2 実行結果

 いかがでしょうか。PHPをよく知る方なら、一度はお目にかかったことがあるコードだと思います。PHPからSQL4Gへのアクセスは、ほかのリレーショナルデータベースと同じ手順で、簡単に実現できます。

 ここからは、シンプルながらも実際の業務で必要となる機能を網羅したPHPアプリケーションを作成し、実際にGAE上で動作させてみましょう。手順で以下のとおりです。

  • アプリケーションの仕様決定
  • PHP4Gでのアプリケーション作成

アプリケーションの仕様

 GAE上に格納されている社員データの検索を行い、その結果を表示して編集を行うアプリケーションをPHPで作成します。

 今回作成する画面イメージを見てみましょう。このアプリケーションは以下の3つの画面を作成します。

  • 社員条件設定/社員登録画面:社員検索条件の設定や、入力した社員の登録を行う画面
  • 社員検索結果表示画面:社員検索の結果を表示する画面
  • 社員編集/社員削除画面:検索結果表示画面で選択した社員の情報を編集/削除を行う画面

 続いて、アプリケーションのデータモデルを見てみましょう。社員の情報を格納するテーブル(T_EMP)とマスタテーブルとして社員の所属(M_DEPT)、社員の勤務体系(M_WORK_TYPE)の3テーブルが存在します。

 データモデルのDDL文を見てみましょう。DataBase名称はDB1、UserNameとPasswordはsaとします。

CREATE TABLE T_EMP (
    EMP_ID BIGINT NOT NULL,
    DEPT_CODE INTEGER NOT NULL,
    WORK_TYPE_CODE  INTEGER NOT NULL,
    NAME VARCHAR(50) NOT NULL,
    ENTER_DATE DATE NOT NULL,
    SEX SMALLINT NOT NULL,
    CREATE_DATETIME TIMESTAMP NOT NULL,
    UPDATE_DATETIME TIMESTAMP NOT NULL
);

CREATE TABLE M_DEPT (
    DEPT_CODE INTEGER NOT NULL,
    DEPT_NAME VARCHAR(50) NOT NULL
);

CREATE TABLE M_WORK_TYPE (
    WORK_TYPE_CODE SMALLINT NOT NULL,
    WORK_TYPE_NAME VARCHAR(50) NOT NULL
);

 このDDLを、SQL4G Database Adminから実行します。SQL4G Database Adminのコンソールの詳細な説明は、http://www.littlesoft.jp/sql4g/を参照してください。また、 今回使用するDDLおよびデータをダウンロードしてください。

prev
2/3
next

Index
PHPでGAE上に社員検索アプリを作る
  Page1
ライブラリの説明
GAE上でファイル保存方法とSmartyのミスマッチ
  Page2
GAE on PHPにおけるSmartyの連携方法
Pear::DBを活用したデータアクセス
  Page3
GAE WebApplication Projectの作成と各種設定
ソースコードの説明
PHP4Gのよくある質問

index GAE+PHP/Rubyで拓く新世界

 Coding Edgeお勧め記事
いまさらアルゴリズムを学ぶ意味
コーディングに役立つ! アルゴリズムの基本(1)
 コンピュータに「3の倍数と3の付く数字」を判断させるにはどうしたらいいか。発想力を鍛えよう
Zope 3の魅力に迫る
Zope 3とは何ぞや?(1)
 Pythonで書かれたWebアプリケーションフレームワーク「Zope 3」。ほかのソフトウェアとは一体何が違っているのか?
貧弱環境プログラミングのススメ
柴田 淳のコーディング天国
 高性能なIT機器に囲まれた環境でコンピュータの動作原理に触れることは可能だろうか。貧弱なPC上にビットマップの直線をどうやって引く?
Haskellプログラミングの楽しみ方
のんびりHaskell(1)
 関数型言語に分類されるHaskell。C言語などの手続き型言語とまったく異なるプログラミングの世界に踏み出してみよう
ちょっと変わったLisp入門
Gaucheでメタプログラミング(1)
 Lispの一種であるScheme。いくつかある処理系の中でも気軽にスクリプトを書けるGaucheでLispの世界を体験してみよう
  Coding Edgeフォーラムフィード  2.01.00.91


Coding Edge フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

>

Coding Edge 記事ランキング

本日 月間