Tips sobre Class mapping con Zend AMF

En resumen Class mapping consiste en relacionar dos clases de lenguajes distintos de tal forma que en cada lenguaje se traten del mismo elemento. Esta relacion (comunmente llamada mapeo en español) permite intercambiar instancias de estas clases entre lenguajes de manera transparente.

Zend AMF mapea por defecto las clases mas comunes como son String, Number, Array, Object, ArrayCollection, etc y tambien permite mapear clases creadas por el usuario. Para lograr el mapeo bidireccional te recomiendo cumplir dos puntos.

  • Define la variable $_explicitType con el alias en cada clase deseas mapear o usa el metodo getASClassName() en lugar de registrar cada mapeo con $serveramf->setClassMap(). Dara mas flexibilidad a tu aplicacion.
  • Intenta relacionar el alias de la clase con la ruta donde la clase PHP a mapear se encuentra. Esto te ayudara a mapear clases de AS3 a Zend AMF.
    Cuando Zend AMF recibe una solicitud lee los alias de las clases AS3 en el mensaje y busca sus clases PHP homologas en el directorio dado por $serveramf->addDirectory(). Si el alias elegido para las clases es, por dar un ejemplo, VO.Usuario Zend AMF buscara la clase VO_Usuario en la ruta VO/Usuario.php.
    Ten en cuenta esto solo si usas addDirectory() para definir la ubicacion de tus servicios y no deseas usar setClassMap() para registrar cada alias.

Las siguientes dos clases se mapearan correctamente entre PHP y AS3 de forma bidireccional.

Ruta: [ServicesPath]/VO/Usuario.php

[sourcecode language=”php”]
<?php
class VO_Usuario{

/**
* Usado por Zend AMF. Devuelve el alias de
* esta clase para actionscript.
* Devuelve una cadena con el nombre de la
* clase actual reemplazando _ por puntos.
*/
public function getASClassName(){
return str_replace("_",".",get_class($this));
}

public $id;
public $username;
public $firstname;
public $lastname;
public $enabled;
}
?>
[/sourcecode]

Nota: En este ejemplo uso getASClassName() para obtener dinamicamente el alias de la clase. Seria muy util que este metodo se encontrara en una clase base y que cada clase a mapear herede de esta. De esta forma no tendras que preocuparte por verificar el alias elegido.

Y por otro lado tenemos su clase homologa en AS3:

Ruta: /net/danielzegarra/VO/UsuarioVO.as

[sourcecode language=”actionscript3″]
package net.danielzegarra.VO{
//Recuerde que no es necesario que el alias tenga relacion
//con el nombre de la clase
[RemoteClass(alias="VO.Usuario")]
public class UsuarioVO{
public var id:uint;
public var username:String;
public var firstname:String;
public var lastname:String;
public var enabled:Boolean;
}
}
[/sourcecode]

La version de Zend Framework al escribirse este documento es la 1.10.
Puedes encontrar la documentacion de Zend AMF en http://framework.zend.com/manual/en/zend.amf.server.html

3 Respuestas

  1. TIMNHE dice:

    Hola Daniel, soy nuevo en el uso de php con flash y estaba trasteando con el zend amf 😛

    Lo que no entiendo muy bien en tu ejemplo, es el nombre de las clases:

    En tu funcion getASClassName() devuelves VO.Usuario .. pero tu clase AS tiene el nombre completo de net.danielzegarra.VO.UsuarioVO

    Como hace el zend para encontrarla¿?

  2. Muy simple. Fijate en la linea 4 del AS, justo antes de empezar la definicion de la clase:
    [RemoteClass(alias="VO.Usuario")]
    Esta linea le dice a Flash Player que si recibe un objeto con la marca VO.usuario debe buscar una clase AS que tenga la misma marca.

  3. TIMNHE dice:

    0.o ‘ Gracias Daniel

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.