AMFPHP Methoden mit Parametern

  • 09.05.2008
  • Flex

Nachdem ich doch mehr als 5 Minuten benötigt habe, um eine PHP Methode die ich mittels AMFPHP zur Verfügung gestellt habe aufzurufen, hier ein weiterer Mini-Artikel zum Thema Flex und AMFPHP.

In der Praxis will man ja meistens nicht einfach eine Methode ohne Argumente aufrufen. Bei mir war es zum Beispiel eine Methode die Datensätze zurückliefert. Dort wollte ich ein paar Daten übergeben, so dass man nicht unnötig viele Datensätze übertragen muss. Das schöne oder auch unschöne an Flex, je nach Anwendungsfalls, ist ja, dass wir lediglich die Daten vom Server zum Client übertragen müssen. Das GUI wird einmalig beim Start übertragen und läuft dann auf dem Client. Bei HTML (AJAX ausgenommen) übertragen wir ja immer eine ganze Reihe Anweisungen die das Layout betreffen. Ein Webdesigner beklagt sich darüber wohl kaum noch, ein Softwareentwickler vielleicht schon eher.

Damit das wirklich ein Mini-Artikel bleibt auch nur ein Auszug aus dem PHP Code. Unsere Methode die wir aufrufen wollen. Sollte nicht klar sein, wie man diese mittels AMFPHP Flex zur Verfügung stellen kann. Im Artikel http://www.codeblog.ch/2008/04/datenaustausch-mit-amfphp-und-flex/ ist dies beschrieben.

function load($transactionId)
{
...

Wir benötigen auch in diesem Fall (ausser wir geben die Adresse zu gateway.php fix an) eine Konfigurationsdatei, welche wir mxmlc mit dem Parameter “-services” übergeben.

<?xml version="1.0" encoding="UTF-8"?>
<services-config>
	<services>
		<service id="amfphp-flashremoting-service" class="flex.messaging.services.RemotingService" messageTypes="flex.messaging.messages.RemotingMessage">
			<destination id="amfphp">
				<channels>
					<channel ref="amfphp-channel"/>
				</channels>
				<properties>
					<source>*</source>
				</properties>
			</destination>
		</service>
	</services>
	<channels>
		<channel-definition id="amfphp-channel" class="mx.messaging.channels.AMFChannel">
			<endpoint uri="http://localhost/amfphp/gateway.php" class="flex.messaging.endpoints.AMFEndpoint"/>
		</channel-definition>
	</channels>
</services-config>

Damit haben wir unsere Konfiguration in eine XML Datei ausgelagert.

Argument übergeben – Variante 1

Wir können direkt in der RemoteObject Definition die Argumente definieren:

<mx:RemoteObject id="myservice" destination="amfphp" source="accounting.TransactionDao" fault="faultHandler(event)" showBusyCursor="true">
   <mx:method name="load" result="transactionResultHandler(event)">
      <mx:arguments>
         <transactionId>{transactionId}</transactionId>
      </mx:arguments>
   </mx:method>
</mx:RemoteObject>

Dies macht vorallem dann Sinn, wenn wir Werte übergeben wollen, die schon zur Verfügung stehen. Zum Beispiel Formularfelder oder sonstige Werte die “bindable” sind.

Das obige Beispiel sucht einfachheitshalber nur eine Variable transactionId, welche sich folgendermassen definieren lässt:

[Bindable]
var transactionId:String;

Wollen wir die Methode aufrufen, so müssen wir sicherstellen, dass die Variable auch einen Wert enthält:

public function loadData(): void
{
   transactionId = 123;
   myservice.load.send();
}

Man erkennt ziemlich schnell, dass dieser Code etwas fraglich ist – wieso sollten wir eine “globale” Variable definieren um einer Methode einen Wert zu übergeben? Wie vorhin erwähnt macht dies vorallem dann Sinn, wenn die Variable bereits vorhanden ist. Ist dies nicht der Fall, so ist Variante 2 wohl zu bevorzugen.

Von Adobe gibt es übrigens auch einen Artikel der dieses Binding Verfahren beschreibt:
http://livedocs.adobe.com/flex/201/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&file=dataservices_099_11.html

Argument übergeben – Variante 2

Wollen wir lokal verfügbare Daten übergeben, so sieht die Angelegenheit noch etwas einfacher aus. Wir definieren bei RemoteObject keine Argumente mehr:

<mx:RemoteObject id="myservice" destination="amfphp" source="accounting.TransactionDao" fault="faultHandler(event)" showBusyCursor="true">
   <mx:method name="load" result="transactionResultHandler(event)"/>
</mx:RemoteObject>

und wer hätte es gedacht, wir können die Argumente direkt übergeben.

public function loadData(): void
{
   myservice.load.send(123);
}

Zugegeben etwas offensichtlich, ich hab aber trotzdem ein paar Minuten benötigt um die zwei unterschiedlichen Methoden zu entdecken – vielleicht hilft’s ja jemandem!

Natürlich hätte man bei Adobe auch dazu einen Artikel gefunden. http://livedocs.adobe.com/flex/201/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&file=dataservices_099_11.html Wenn man nur gleich an der richtigen Stelle suchen würde, wäre das alles kein Problem gewesen!




Keine Kommentare


You can leave the first : )



Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *