Blog de Daniel Zegarra Rotating Header Image

AMFPHP

Compatibilizando AMFPHP1.9beta2 con Zend Framework

La verdad es simple.

Primero, incluir el directorio donde se encuentra los archivos de Zend Framework entre las rutas a cargar archivos por defecto. Esto puede hacerse de dos formar:

  • Definiendolo en php.ini
    La clave a cambiar tiene el nombre de include_path. Esta es una cadena con rutas separadas por un caracter especial. Este puede diferir de acuerdo al SO siendo los dos puntos “:” para Linux o la barra oblicua “\” para Windows.
  • Agregando la siguiente línea en globals.php
    //El siguiente método define un directorio más a la lista de
    //rutas por defecto al usar include o require
    //Cambia ZendLibrary por el directorio donde tengas la libreria.
    //Ejm: /../../ZendLib
    set_include_path( realpath(dirname(__FILE__)) . '/ZendLibrary'
    . PATH_SEPARATOR . get_include_path() );
    

Luego, agregar un par de líneas al bootstrap de AMFPHP para que cargue la clase Zend_Loader y asi nuestros servicios puedan usar otras clases/servicios sin tener que cargarlos al inicio (Y asi te ahorras de estar escribiendo tanto require_once).

Agrega las siguientes líneas al final del archivo globals.php

include 'Zend/Loader.php';
Zend_Loader::registerAutoload();

Por ultimo, debes configurar AMFPHP para que convierta los puntos que describen las rutas de tus clases en undelines (_). Zend Framework incluye en los nombres de sus clases la ruta completa donde esta se encuentra y mantenendo el nombre estandar como nombre de archivo.

Esto evita la redundancia de clases (al menos hasta que lleguen los namespaces con php 5.3) y te sirve para que Zend_Loader pueda cargar las clases de forma dinámica.

Normalmente AMFPHP convierte los puntos en barras diagonales “/” y el ultimo elemento lo toma como nombre del servicio/clase. Hay que hacer que como nombre de la clase use la ruta completa pero cambiando las barras diagonales por underlines. Para esto debes cambiar una sola linea de codigo en el archivo core\amf\app\Actions.php ubicado en tu instalacion de AMFPHP. Te recomiendo hacer una copia de este mismo antes de realizar un cambio.

//Linea 122 (aproximadamente)
//Esto hará que el nombre de la clase sea ahora la ruta
//completa con guiones bajos mas el nombre del servicio
$classname = str_replace('.', '_', $trunced);

Eso es todo. No te olvides de recodificar los nombres de tus clases si es que ya has empezado algunas. Asi mismo, si tus clases usaban a su vez otras, tambien debes actualizar estas llamadas o tu script se detendrá sin entregar error alguno a flash.

Aqui tienes un servicio de prueba y el código en AS2 y AS3 para probarlo.

PHP service:

class System_Prueba {
public function test(){
return 'Prueba exitosa';
}
}

ActionScript 2:

import mx.remoting.*;
import mx.rpc.*;
var service = new Service('http://testserver/amfphp/gateway.php'
, null, 'System.Prueba');
var pc:PendingCall = service.test();
pc.responder = new RelayResponder(this, 'onRespond', 'onFault');
function onRespond(re:ResultEvent){
trace(re.result);
}
function onFault(fault:FaultEvent){
trace('Error');
}

ActionScript 3:

import flash.net.*;
var rs:NetConnection = new NetConnection();
rs.connect('http://testserver/amfphp/gateway.php');
rs.call('System.Prueba.test', new Responder(onRespond, onFault));
function onRespond(re:Object){
trace(re);
}
function onFault(fault:Object){
trace('Error: '+fault.description);
}

Actualización: Encuentro en el blog de Enrique Place el aviso de un cambio importante con el uso de la clase Zend_Loader en la última versión de ZendFramework 1.8 y futuras versiones. Es una buena idea revisar este post.

Flash Remoting usando AS2 en Flash 9 sobre Windows Vista

Si trabajas con Flash desde hace un par de años debes de haber escuchado de Flash Remoting, a lo mejor trabajas actualmente con esta tecnología.

Algo que me disgustó cuando Adobe lanzo Flash 9 fué que entre las clases as2 que venían con flash9 no se encontraban las necesarias para usar remoting. Esto dejaba desamparados a todos los usuarios que usaban amf para comunicarse con sus servidores, con el único remedio de seguir usando Flash 8 o pasar todo su código a AS3. Yo elegí el primero, pasar todo lo que tengo a AS3 me llevaría meses de trabajo sin descanso (pero en algún momento lo debo hacer).

Cuando tuve este problema encontré el directorio Classes entre los archivos instalados de Adobe Flash CS3 y en ella el directorio mx que al parecer esta nueva versión seguiría usando para copilar como flash 8 o anteriores. Pensando que copiando las clases necesarias resolvería todo el problema, lo hice, pero no surtió efecto. Flash CS3 me seguía informando que no encontraba la clase NetConnection. Debería haber funcionado, no sabia por que no resultó, hasta hoy.

Investigando por el mismo problema encontré este link en que relataba lo mismo que hice yo anteriormente y que en este caso asombrosamente le resultó.

El truco radicaba en esto (y no esta en ese link):

Desde windows XP, este SO maneja las configuraciónes de sesiones de manera tan independiente que, Flash CS3 al momento de compilar cualquier código, lo hace usando las clases instaladas en la sesión actual.

Las clases ubicadas en Program Files/Adobe no son usadas al momento de compilar, asi que puedes borrarlas si quieres y no pasa nada. (Mejor no lo hagas, no vaya a ser que la cagues).

Te explico los pasos a seguir para que puedas compilar tus archivos fla de Flash 8 en CS3 ;-)   :

  • Descarga el archivo .zip que Alastair publica en su post (ir al post). Este .zip contiene las clases necesarias para este manual.
  • Luego, extrae el contenido en las siguientes direcciónes (cambia “C:/” por la letra de tu unidad y “Daniel Zegarra” por el nombre de tu cuenta):
    C:\Program Files\Adobe\Adobe Flash CS3\es\First Run\Classes
    C:\Users\Daniel Zegarra\AppData\Local\Adobe\Flash CS3\es\Configuration\Classes
    La primera es donde se ubican los archivos instalados de Flash CS3 y la segunda, la ubicación de las clases que son realmente usadas cuando compilas tus archivos.
  • Creo que no es necesario reiniciar tu Pc pero por las moscas hazlo.

Actualización 17/05/09: En caso el archivo zip no se encontrase disponible, puedes descargarlo localmente desde este el siguiente enlace:
Descargar Clases AS2 de Flash Remoting