Start » Artykuły » Komunikacja Flex-PHP za pomocą AMFPHP

Komunikacja Flex-PHP za pomocą AMFPHP

Data dodania2010-02-12 Autoradmin

Tagi: amfphp, komunikacja, RemoteObject, amf, php

Poziom trudności: Podstawowy

Na początek kilka słów wstępu.
AMF (ang. Action Message Format) jest to binarny format służący do serializacji obiektów ActionScript. Służy on do wymiany danych pomiędzy aplikacjami Flex/Flash ze zdalnymi usługami (np. serwer danych w PHP). Ogólnie rzecz biorąc aplikacja zaimplementowana we Fleksie używa usług udostępnionych przez serwer (PHP) do pobierania (lub wysyłania) danych z (do) bazy danych. A jeszcze prościej pozwala z aplikacji Fleksowej bezpośrednio tworzyć obiekty klas zaimplementowanych w PHP i wywoływać ich metody.

Zanim zaczniemy pobieramy niezbędną do tego celu bibliotekę ze strony projektu http://sourceforge.net/projects/amfphp/files/#files
Po rozpakowaniu kopiujemy zawartość katalogu amfphp NR.WERSJI (u nas 1.9) do katalogu amfphp znajdującego się w katalogu głównym serwera www (web root).
Mamy następującą strukturę:

\browser - przeglądarka dostępnych usług
\core    - jądro biblioteki
\services - katalog z usługami
\gateway.php - brama, przez którą się komunikujemy
\globals.php - ustawienia
\json.php
\xmlrpc.php

 

Na początek definiujemy katalog, w którym będziemy umieszczać udostępnione usług (domyślnie services). Jeżeli nam to nie odpowiada możemy zmienić ścieżkę w pliku globals.php ($servicesPath).
Kolejnym krokiem będzie stworzenie testowej usługi. W tym celu w katalogu services tworzymy plik Test.php o następującej zawartości:

<?php
class Test {
    function getArray()
    {
        return array('test1','zażółć gęślą jaźń');
    }
}
?>


Teraz przechodzimy do sprawdzenia czy nasza usługa działa, czyli wpisujemy w przeglądarce adres, w naszym przypadku będzie to:
http://localhost/amfphp/browser

Zostaniemy teraz poproszeniu o konfigurację, którą zostawiamy bez zmian. Należy zwrócić uwagę, że Gateway location kieruje właśnie na nasz plik gateway.php.
W lewej kolumnie wybieramy Test. Teraz w prawym panelu powinniśmy mieć aktywną zakładkę Test z listą dostępnych metod. My mamy jedną getArray(), więc wybieramy ją i klikamy Call.
Poniżej powinna pojawić się zawartość naszej tablicy.
Jeśli mamy błędne kodowanie znaków należy sprawdzić kodowanie pliku Test.php (np. UTF-8). Następnie w pliku gateway.php odszukujemy linię:

$gateway->setCharsetHandler("utf8_decode", "ISO-8859-1", "ISO-8859-1");

i zmieniamy ją na:

$gateway->setCharsetHandler("utf8_decode", "UTF-8", "UTF-8");

gdzie pierwszy parametr to metoda konwersji, drugi kodowanie PHP, trzeci kodowanie bazy danych.

Teraz możemy rozbudować nasz przykład o kolejną metodę:

function add($num1 = 0,$num2 = 0)
{
    return $num1+$num2;
}

Dla uproszczenia nie sprawdzamy typów przekazanych zmiennych, w rzeczywistym projekcie należałoby to zrobić.
Wracamy do browser'a, odświeżamy listę metod klikając w ikonę .

Jak można zauważyć lista dostępnych metod powiększyła się o metodę add, którą klikamy i podajemy wartości 2 argumentów. Następnie klikamy Call i w oknie poniżej powinniśmy otrzymać wynik dodawania 2 podanych liczb.

 

 

Teraz przechodzimy do utworzenia aplikacji w Adobe Flex.
Na początek utworzymy 'obiekt zdalny' (RemoteObject) reprezentujący naszą klasę Test.

<mx:RemoteObject 
    id="test"
    endpoint="http://localhost/amfphp/gateway.php"
    fault="faultHandler(event)"
    source="Test"
    destination="amfphp">
    <mx:method name="getArray" result="resultHandler(event)" />
    <mx:method name="add" result="resultHandler(event)" />
</mx:RemoteObject>

Jak można zauważyć mamy tu zdefiniowany adres bramy (endpoint), nazwę klasy w PHP (source) oraz dwie metody getArray i add.

Kolejnym etapem będzie zdefiniowanie przycisków, które posłużą do wywołania naszych metod oraz stworzenie pola, które wyświetli dane zwrócone z serwera.

<mx:HBox>
    <mx:Button label="getArray" click="test.getArray();"/>
    <mx:Button label="add" click="test.add(2,4);"/>
    <mx:Button label="Fault" click="test.foo();"/>
</mx:HBox>
<mx:TextArea id="result" width="500" height="220"/>


Zauważmy, że dla metody add po prostu przekazujemy argumenty tak jakbyśmy wywoływali metodę bezpośrednio z PHP.
Dodatkowo utworzyliśmy jeden przycisk wywołujący nieistniejącą metodę, aby przetestować funkcję faultHandler.

Pozostało teraz zdefiniować funkcje faultHandelr i resultHandler w tym celu tworzymy sekcję mx:Script z następującą zawartością:

import mx.rpc.events.ResultEvent;
import mx.rpc.events.FaultEvent;

private function faultHandler(fault:FaultEvent):void
{
    result.text = "code:\n" + fault.fault.faultCode + "\n\nMessage:\n" + fault.fault.faultString;
}

private function resultHandler(event:ResultEvent):void
{
    result.text = event.result.toString();
}


Całość naszego przykładu powinna prezentować się następująco:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Script>
        <![CDATA[
            import mx.rpc.events.ResultEvent;
            import mx.rpc.events.FaultEvent;
            private function faultHandler(fault:FaultEvent):void
            {
                result.text = "code:\n" + fault.fault.faultCode + "\n\nMessage:\n" + fault.fault.faultString;
            }

            private function resultHandler(event:ResultEvent):void
            {
                result.text = event.result.toString();
            }
        ]]>
    </mx:Script>
    <mx:RemoteObject
        id="test"
        endpoint="http://localhost/amfphp/gateway.php"
        fault="faultHandler(event)"
        source="Test"
        destination="amfphp">
        <mx:method name="getArray" result="resultHandler(event)" />
        <mx:method name="add" result="resultHandler(event)" />
    </mx:RemoteObject>
    <mx:HBox>
        <mx:Button label="getArray" click="test.getArray();"/>
        <mx:Button label="add" click="test.add(2,4);"/>
        <mx:Button label="Fault" click="test.foo();"/>
    </mx:HBox>
    <mx:TextArea id="result" width="500" height="220"/>
</mx:Application>

 

Teraz pozostało już tylko przetestować aplikację, w tym celu klikamy w kolejne przyciski i obserwujemy wyniki w pole tekstowym poniżej. Zgodnie z przewidywaniem wywołanie metody foo spowodowało wyświetlenie komunikatu błędu The method {foo} does not exist in class {Test}.

 

Kopiuj link do tej strony

Jeżeli chcesz przesłać znajomemu link do tej strony lub wkleić go na swoim blogu lub stronie, możesz poniżej skopiować go w odpowiednim formacie

Komentarze

Qba napisał(a):

wielkie dzięki za to bo na stronie amfphp to nie znalazłem nawet pół przykładu

2010-02-13 | 01:06:35

fakir napisał(a):

dokładnie na stronie amfphp nic nie ma w temacie flex'a

2010-02-16 | 10:54:37

radian napisał(a):

fajnie, że ktoś dba o nas - "odpornych"
DZIĘKI !

jeszcze przydał by się przykładzik na komunikację z bazą MySQL !

2010-03-16 | 17:04:01

mike napisał(a):

To już właściwie czyste php, więc nie chciałem komplikować przykładu. Chodziło tylko nawiązanie połączenia i pobranie danych.
W funkcji getArray() możesz połączyć się z bazą i zwrócić dane z bazy, ale to już kwestia php.

2010-03-16 | 22:03:04

Iras napisał(a):

Przykład się przydał, dzięki wielkie :)

Co do pobrania danych z bazy MySQL:
Mam zmienną "$wynik" do której zostały pobrane dane z bazy (wykonanie zapytania mysql wygenerowało wynik składający się z 3 kolumn i 5 wierszy). I teraz jak to przenieść z php do flexa?
Pytam bo Service Browser od amfphp po wciśnięciu Call zwraca jakieś errory o błędnym typie danych.
W pliku php mam wpisane return($wynik);
Z góry dzięki za info.

2010-07-21 | 21:57:43

mike napisał(a):

Jaki jest konkretnie kod błędu? Może zmienna $wynik nie przechowuje tego czego oczekujesz. Najlepiej załóż nowy temat na forum i wklej kod, wtedy będę mógł powiedzieć coś więcej.

2010-07-21 | 22:29:30

damper20 napisał(a):

Mam windows Vista (bez servis packów) . Do tego Amfphp 1.9 , serwer wamp , flex sdk 3.0 + flashdevelop . Robię podobny przykład .
Sprawdzałem i :
localhost/amfphp/browser działa . Niestety wywala się uruchomiony swf na :



Code:

Client.Error.MessageSend



Message :

Send Failed


Detail :

Channel.Connect.Failed.error

Netconnection.Call.BadVersion :url :

http://localhost/amfphp/gateway.php





Robię to z podobnego przykładu :

http://www.sephiroth.it/tutorials/flashPHP/flex_remoteobject/index.php



ustawiłem opcje w flashDevelop -services=service-config.xml





Czy problem jest w tym pliku : services-config.xml ?


Zmieniłem w nim linie z localhost - tak jak powyżej - jakie linie trzeba jeszcze zmienić ?

2010-09-07 | 08:50:04



Wyszukiwarka

Zaloguj się




Nie masz konta? zarejestruj się »

Zapomniałem hasła

Tagi

Ostatnio na forum

Dodatki

blip