Flex+PHPアプリケーションの構築
プロジェクトが適切に設定されたので、今度は、Zend AMFを利用してPHPスクリプトと通信する、小さなFlexアプリケーションを開発することにします。Zend AMFを使用することで、Flexデベロッパーは、FlexからPHPクラスへのリモートプロシージャーコールを実行できます。これはオープンソースプロジェクトであるZend Frameworkの一部です。
PHPコードの作成
Zend AMFを利用すれば、FlexアプリケーションからPHPクラスのメソッドコールを行えます。ただし、呼び出すPHPクラスは、必ずサーバーのWebルートに配置されている必要があります。
PHPコードを記述する際に、この作業をZend Studioから行えれば便利なのは言うまでもありません。しかしここで問題になるのは、開発対象のプロジェクトファイルがサーバーのルートフォルダに配置されていないことです(つまり、Webサーバールートフォルダ内にPHPクラスを作成した場合は、Flex PHPプロジェクト上で、このクラスを確認することができません)。
幸運にも、この問題に対しては簡単な解決策があります。Eclipseでは、プロジェクトに外部フォルダをリンクできます。
まず、Webサーバールート内にzendamf_remoteという名前のフォルダを作成します。Zend Studioの作業画面に戻り、表示がFlex開発パースペクティブになっていることを確認します。そして、プロジェクト名を右クリックし、メニューから[New(新規)]-[Other(その他)]を選択します。表示されたウィザード上の[Folder(フォルダ)]を選択し、[Next(次へ)]ボタンをクリックします。
[New(新規)]ウィザードが開始されたら、[Advanced(拡張)]ボタンをクリックして、Webサーバールートフォルダを参照し、zendamf_remoteフォルダを選択します(図10を参照)。[Finish(終了)]ボタンをクリックすると、プロジェクト内にzendamf_remoteという名前のフォルダが新規作成されているはずです。
次に、EclipseでPHPパースペクティブを選択し(図11を参照)、zendamf_remoteフォルダを右クリックして、[新規]-[その他...]を選択します。

[New(新規)]ウィザードが開いたら、PHPノードからクラスエントリを選択し、[Next(次へ)]ボタンをクリックします。[New(新規)]ウィザードで、ファイル名(MyService.php)とクラス名(MyService)を入力した後、[Finish(終了)]ボタンをクリックします(図12を参照)。このステップを繰り返して、VOAuthorという名前の別のクラスを作成します。
最初に、データがいくつか入ったテーブルをMySQLデータベースサーバーに追加します。次のコードが使用できます。
CREATE TABLE `authors_aut` ( `id_aut` int(11) NOT NULL auto_increment, `fname_aut` varchar(255) NOT NULL, `lname_aut` varchar(255) default NULL, PRIMARY KEY (`id_aut`), UNIQUE KEY `fname_aut` (`fname_aut`,`lname_aut`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ; INSERT INTO `authors_aut` VALUES (1, 'Dantes', 'Alighierie'); INSERT INTO `authors_aut` VALUES (2, 'William', 'Shakespeare'); INSERT INTO `authors_aut` VALUES (3, 'Umberto', 'Eco'); INSERT INTO `authors_aut` VALUES (4, 'Niccolo', 'Machiavelli');
ここでしようとしているのは、MySQLデータベースのテーブルからすべてのレコードを取得するPHPコードと、同じテーブルの1つのレコードを更新するコードを作成することです。このために、MyServiceというPHPクラスを作成し、このクラスをFlexから呼び出します。このクラスは、getData()とsaveData()の2つのメソッドを提供します。
次に、テーブルの1つの行のデータモデルの役割を果たすVOAuthorというPHPクラスを作成します。そこで、これらのファイルすべてにコードを追加してみます。
Eclipseによって新規ファイルが生成され、編集可能な状態で開かれます。次に示すのはMyServiceクラスのコードです(実際のデータベースの設定に応じて、接続情報を変更する必要があります。このためには、クラスの上部にある4つの定数を参照してください)。
<?php require_once 'VOAuthor.php'; //conection info define(":DATABASE_SERVER":, ":localhost":); define(":DATABASE_USERNAME":, ":mihai":); define(":DATABASE_PASSWORD":, ":mihai":); define(":DATABASE_NAME":, ":flex360":); class MyService { /** * Retrieve all the records from the table * @return an array of VOAuthor */ public function getData() { //connect to the database. //we could have used an abstracting layer for connecting to the database. //for the sake of simplicity, I choose not to. $mysql = mysql_connect(DATABASE_SERVER, DATABASE_USERNAME, DATABASE_PASSWORD); mysql_select_db(DATABASE_NAME); //retrieve all rows $query = ":SELECT id_aut, fname_aut, lname_aut FROM authors_aut ORDER BY fname_aut":; $result = mysql_query($query); $ret = array(); while ($row = mysql_fetch_object($result, ":VOAuthor":)) { $ret[] = $row; } mysql_free_result($result); return $ret; } /** * Update one item in the table * @param VOAuthor to be updated * @return NULL */ public function saveData($author) { if ($author == NULL) return NULL; //logMe($author); //connect to the database. $mysql = mysql_connect(DATABASE_SERVER, DATABASE_USERNAME, DATABASE_PASSWORD); mysql_select_db(DATABASE_NAME); if ($author->id_aut > 0) { //save changes $query = ":UPDATE authors_aut SET fname_aut='":.$author->fname_aut.":', lname_aut='":.$author->lname_aut.":' WHERE id_aut=":. $author->id_aut; } else { //add new record $query = ":INSERT INTO authors_aut (fname_aut, lname_aut) VALUES ('":.$author->fname_aut.":', '":.$author->lname_aut.":')":; } $result = mysql_query($query); return NULL; } } ?>
次に、データモデルであるValueオブジェクトのコードを作成します。ファイルVOAuthor.phpを選択し、次のコードを貼り付けます。
<?php class VOAuthor { public $id_aut; public $fname_aut; public $lname_aut; } ?>
見ればわかるように、このクラスは非常に単純です。単にテーブルのフィールドと同じメンバーを提供するだけです。リモーティングを使用する場合、データが自動的に適切な型にキャストされます。例えば、MyService.getData()メソッドはVOAuthor PHPオブジェクトの配列を返します。ただし、後で見るように、Flexでは結果はVOAuthor ActionScriptオブジェクトの配列です。
Flexアプリケーションの作成
PHPコードの準備が整ったので、次に、PHPクラスを呼び出すFlexコードを作成することにします。ここで作成するのは、データグリッドを使用して、データと1行編集用のフォームを表示するFlexアプリケーションです。
まず、Eclipseの画面右上のアイコンをクリックし、画面がFlex開発パースペクティブになっていることを確認します。幸い、Flash Builder 4には、PHPサービスを利用する場合に便利な新しいウィザードがいくつか用意されています。これらのウィザードは、新しいデータとサービスビューからアクセスできます(図13を参照)。このビューが表示されていない場合、[Window(ウィンドウ)]-[Other Views...(他のビュー...)]を選択し、Flash Builderノードからデータとサービスエントリを選択します。

次に、flex_php.mxmlファイルを開き、デザインビューを選択します。コンポーネントビューからDataGridをシーンにドラッグして、DataGridコンポーネントを追加します(図14を参照)。
これで、MyService.phpクラスを利用するクライアントサイドサービスを作成するための最初のウィザードを使用する準備ができました。データとサービスビューから、データとサービスに接続リンクをクリックします。ウィザードが開いたら、PHPを選択し(図15を参照)[Next(次へ)]ボタンをクリックします。
![図15. [Connect to Data/Service...(データとサービスに接続...)]ウィザードの1ページ目](http://cz-cdn.shoeisha.jp/static/images/article/5296/15s.gif)
ウィザードの2ページ目で[Browse...(参照...)]ボタンを使用して、PHPサービス「MyService.php」を選択します(図16を参照)。[Next(次へ)]ボタンをクリックすると、警告ウィンドウがポップアップします(図17を参照)。
[Data/Service(データとサービス)]ウィザードは、Zend FrameworkのZendAMF部分を使用して、PHPに対するリモーティングを使用可能にします。[OK]をクリックすると、ウィザードがフレームワークをインストールします。
Zend Frameworkがインストールされると、ウィザードがPHPサービス(MyService.php)を分析し、PHPクラスのパブリックメソッドが表示されます(図18を参照)。[Finish(完了)]ボタンをクリックします。
