「SabreAMF」とは、Flexアプリケーション中にAMFPHPを利用してPHP、MySQLと接続、通信サンプルソースコードのAMFPHPと同じ、AirのSWFファイルからPHPが動いているサーバーに接続する為AMFというフォーマットに従って通信を行うPHPライブラリです(実はPHPObject: PHPとFlashのActionScript連携パッケージも同じ機能か)。

SabreAMFを使用することで、AMFフォーマットでFlashからPHPメソッドを呼び出すことができます。

【機能・特徴】

◇ AMF Server/Client
◇ PHP5 OOP
◇ AMF0~AMF3対応
◇ ライセンス:New BSD License

【使用方法】

・SabreAMFの最新ライブラリをhttp://code.google.com/p/sabreamf/downloads/list からダウンロードして、解凍しSabreAMFに改名して、

/PROJECT_DIR/app/vendors/SabreAMF

に配置します。

・パス設定用のファイル

  1. /PROJECT_DIR/app/vendors/sabreamf_ini.php

を作成します。

内容:

  1. <?php
  2.  
  3. //sabreamf_ini.php
  4.  
  5. define(’SABREAMF_PATH’, dirname(__FILE__));
  6.  
  7. set_include_path(SABREAMF_PATH . PATH_SEPARATOR . get_include_path());
  8.  
  9. ?>

・サンプルのコンポーネントsabre_amf.php を

  1. /PROJECT_DIR/app/controllers/components/sabre_amf.php

に設置します。

  1. <?php
  2.  
  3. //sabre_amf.php
  4. vendor(”sabreamf_ini”);
  5. vendor(’SabreAMF/CallbackServer’);
  6.  
  7. $_cakeController = null;
  8.  
  9. function amfCallBack($service, $method, $data) {
  10. global $_cakeController;
  11.  
  12. $res = null;
  13.  
  14. if ($_cakeController) {
  15. if (strpos($method, “_”) !== 0) { // _(アンダーバー)で始まるmethodはエラー。
  16.  
  17. $_cakeController->amfData = $data;
  18.  
  19. if (method_exists($_cakeController, $method)) {
  20. $res = $_cakeController->{$method}();
  21. } else {
  22. $res = “not found action.”;
  23. }
  24.  
  25. } else {
  26. $res = “invalid method name.”;
  27. }
  28.  
  29. } else {
  30. $res = “not found controller.”;
  31. }
  32.  
  33. return $res;
  34. }
  35.  
  36. class SabreAmfComponent extends Object {
  37.  
  38. function initialize(&$controller) {
  39.  
  40. global $_cakeController;
  41. $_cakeController = $controller;
  42. $controller->isAmf = true; // default true
  43. }
  44.  
  45.  
  46. function startup(&$controller) {
  47. if ($controller->isAmf) {
  48.  
  49. Configure::write(’debug’, 0);
  50.  
  51. $controller->autoRender = false;
  52. $server = new SabreAMF_CallbackServer();
  53. $server->onInvokeService = ‘amfCallBack’;
  54. $server->exec();
  55.  
  56. exit; //ここでexitしてるので、amf の 場合はほかのactionは呼べないはず。。。
  57. }
  58. }
  59.  
  60. function beforeRender(&$controller) {
  61.  
  62. if ($controller->isAmf) {
  63. exit; //  念のため
  64. }
  65. }
  66. }
  67. ?>

以下、簡単な、文字列と、配列のやり取りのサンプル用Controllerです。

  1. <?php
  2.  
  3. class AmfsController extends AppController {
  4.  
  5. var $name = ‘Amfs’;
  6. var $uses = array();
  7. var $components = array(”SabreAmf”);
  8.  
  9. function beforeFilter() {
  10.  
  11. // ここでamf出力ではないactionを設定できる
  12. // 全部amf出力の場合は何も設定いらない。
  13. // この場合は「normal」のみ通常アクセスできる。
  14. // ほかのactionは、URLからは実行されないはず。。。
  15. if ($this->action == “normal”) {
  16.  
  17. $this->isAmf = false;
  18. Configure::write(’debug’, 2);
  19. $this->autoRender = true;
  20. }
  21. }
  22.  
  23. // indexアクションは通常出力に使わないほうがいい
  24. // beforeFilterで除外すると、初期アクセスがamfから指定ない場合、
  25. // リモートで呼び出されたときにエラーでちゃう
  26.  
  27. function index() {
  28. return “index”;
  29. }
  30.  
  31. //これは通常表示できるアクション
  32. function normal() {
  33. $this->set(”hoge”, date(”Y-m-d H:i:s”));
  34. }
  35.  
  36. //文字列返却
  37. function getstr() {
  38. $testname = $this->amfData[0]; // flashから送られてきた値はamfDataにある。しかし、キーが消えてるよ。。。
  39.  
  40. return date(”Y-m-d H:i:s”) . ” こんにちは ” . $testname; //各action で return した値が flashに返る。
  41. }
  42.  
  43. //配列返却
  44. function getarr() {
  45.  
  46. $res_list = array();
  47. for($i = 0; $i < 10; $i++) {
  48. $res = array(
  49. col1″ => $i,
  50. “col2″ => rand(1, 1000),
  51. );
  52.  
  53. $res_list[] = $res;
  54. }
  55.  
  56. $this->log(print_R($res_list, true), LOG_ERROR);
  57. return $res_list;
  58. }
  59. }
  60. ?>

このコントローラにFlashからリクエストのサンプルです。

  1. <?xml version=”1.0encoding=”utf-8?>
  2.  
  3. <mx:Application xmlns:mx=”http://www.adobe.com/2006/mxmllayout=”vertical>
  4. <mx:Script>
  5.  
  6. <![CDATA[
  7.  
  8. import mx.rpc.events.FaultEvent;
  9. import mx.rpc.events.ResultEvent;
  10. import mx.controls.Alert;
  11. import mx.utils.ArrayUtil;
  12.  
  13. [Bindable]
  14. private var myDataItem:Array = [];
  15. private function resultHandler(evt:ResultEvent):void {
  16.  
  17. myDataItem = ArrayUtil.toArray(evt.result);
  18. }
  19.  
  20. private function faultHandler(evt:FaultEvent):void {
  21.  
  22. Alert.show(”Fault: ” + evt.fault + ” Msg: ” + evt.message);
  23. }
  24.  
  25. ]]>
  26.  
  27. </mx:Script>
  28.  
  29. <!–
  30. remoting-config.xmlをちゃんと設定したほうがいいのかな?
  31. このサンプルでは、xmlを用意しないで、endpoint指定でやってます。
  32. endpoint=”{’http://{server.name}:{server.port}/amfs/’}” と書けば、
  33. flash設置サーバの/amfs/と通信します。
  34. 以下のようにendpoint(cakecontroller呼び出し用URL)さえ指定しておけば
  35. source は今回の場合は適当でいいです。というのも、sevice名として
  36. サーバで受け取りますが、endpointcakecontroller
  37. メソッドしか呼べないようにしているので送信しているが使っていない。
  38. また、destinationも適当でいいですが指定しないとエラーでます。
  39. >
  40.  
  41. <!– 文字列読み込み例 –>
  42. <mx:RemoteObject id=”ro
  43. endpoint=”{’http://{server.name}:{server.port}/amfs/’}”
  44. destination=”MyAmfs
  45. source=”Amfs
  46. result=”myLabel.text = event.result.toString()”
  47. fault=”faultHandler(event)”>
  48.  
  49. <mx:method name=”getstr>
  50. <mx:arguments>
  51. <testname>hoge</testname>
  52. </mx:arguments>
  53. </mx:method>
  54. </mx:RemoteObject>
  55. <mx:Label text=”string_sampleid=”myLabel/>
  56. <mx:Button label=”string load testclick=”ro.getstr.send()” x=”24y=”42/>
  57. <!– ro.●●.send() でcake側のアクションを呼べる –>
  58.  
  59. <mx:Spacer height=”2width=”200/>
  60.  
  61. <!– 配列読み込み例 –>
  62. <mx:RemoteObject id=”ro2
  63. endpoint=”{’http://{server.name}:{server.port}/amfs/’}”
  64. destination=”MyAmfs
  65. source=”Amfs
  66. result=”resultHandler(event)”
  67. fault=”faultHandler(event)”>
  68. </mx:RemoteObject>
  69. <mx:Button label=”array load testclick=”ro2.getarr.send()”  x=”24y=”42/>
  70. <mx:DataGrid id=”myDatadataProvider=”{myDataItem}”>
  71. <mx:columns>
  72. <mx:DataGridColumn headerText=”列 1dataField=”col1/>
  73. <mx:DataGridColumn headerText=”列 2dataField=”col2/>
  74. </mx:columns>
  75. </mx:DataGrid>
  76. </mx:Application>

【参考リソース】

http://code.google.com/p/sabreamf/

http://blog.non-style.com/2008/11/cakephp-airsabreamfcakephp.html

http://blog.asial.co.jp/347

メインコンテンツEND ■
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

Posted on Friday, 28th August 2009 by admin

Tags: , , ,
Posted in Flash Project, PHP | Comments (2) | 3,659 views

2 Responses to “SabreAMF: FlexをPHP5と連携させるフレームワーク”

  1. Flash・FlexとPHP連携ライブラリ2点 « First Brand System Division Says:

    [...] http://digitechlog.com/2009/08/28/sabreamf-is-a-flash-remoting-server-and-client-for-php.html [...]

  2. PyAMF: PythonのためにAdobeのFlash Playerに対応しているサポートアクションメッセージ形式( AMF )を提供する | DigiTechLog Dot Com Says:

    [...] この前はPHPからAMFメソッドを呼び出すライブラリ「SabreAMF: FlexをPHP5と連携させるフレームワーク」などと.NETの「FluorineFx: Flexと.NET間でAMF通信できるライブラリ」を紹介しましたね。フ [...]

Leave a Reply