|
@@ -4,20 +4,20 @@
|
|
|
<sect1 id="zend.amf.server">
|
|
<sect1 id="zend.amf.server">
|
|
|
<title>Zend_Amf_Server</title>
|
|
<title>Zend_Amf_Server</title>
|
|
|
|
|
|
|
|
- <para>
|
|
|
|
|
|
|
+ <para>
|
|
|
<classname>Zend_Amf_Server</classname> proporciona un servidor al estilo
|
|
<classname>Zend_Amf_Server</classname> proporciona un servidor al estilo
|
|
|
<acronym>RPC</acronym> para tramitar solicitudes hechas desde Adobe
|
|
<acronym>RPC</acronym> para tramitar solicitudes hechas desde Adobe
|
|
|
Flash Player utilizando el protocolo <acronym>AMF</acronym>. Al igual
|
|
Flash Player utilizando el protocolo <acronym>AMF</acronym>. Al igual
|
|
|
que todas las clases de servidor, Zend Framework sigue la
|
|
que todas las clases de servidor, Zend Framework sigue la
|
|
|
<acronym>API</acronym> de SoapServer, proporcionando una interfaz
|
|
<acronym>API</acronym> de SoapServer, proporcionando una interfaz
|
|
|
- para crear servidores fácil de recordar. </para>
|
|
|
|
|
|
|
+ para crear servidores fácil de recordar.</para>
|
|
|
|
|
|
|
|
<example id="zend.amf.server.basic">
|
|
<example id="zend.amf.server.basic">
|
|
|
<title>Servidor AMF básico</title>
|
|
<title>Servidor AMF básico</title>
|
|
|
|
|
|
|
|
- <para> Asumamos que ha creado la clase <classname>Foo</classname> con
|
|
|
|
|
|
|
+ <para>Asumamos que ha creado la clase <classname>Foo</classname> con
|
|
|
una variedad de métodos públicos. Usando el siguiente código, puede
|
|
una variedad de métodos públicos. Usando el siguiente código, puede
|
|
|
- crear un servidor <acronym>AMF</acronym>: </para>
|
|
|
|
|
|
|
+ crear un servidor <acronym>AMF</acronym>:</para>
|
|
|
|
|
|
|
|
<programlisting language="php"><![CDATA[
|
|
<programlisting language="php"><![CDATA[
|
|
|
$servidor = new Zend_Amf_Server();
|
|
$servidor = new Zend_Amf_Server();
|
|
@@ -26,8 +26,8 @@ $respuesta = $servidor->handle();
|
|
|
echo $respuesta;
|
|
echo $respuesta;
|
|
|
]]></programlisting>
|
|
]]></programlisting>
|
|
|
|
|
|
|
|
- <para> Alternativamente, en su lugar puede elegir agregar una función
|
|
|
|
|
- simple como llamada de retorno: </para>
|
|
|
|
|
|
|
+ <para>Alternativamente, en su lugar puede elegir agregar una función
|
|
|
|
|
+ simple como llamada de retorno:</para>
|
|
|
|
|
|
|
|
<programlisting language="php"><![CDATA[
|
|
<programlisting language="php"><![CDATA[
|
|
|
$servidor = new Zend_Amf_Server();
|
|
$servidor = new Zend_Amf_Server();
|
|
@@ -36,12 +36,12 @@ $respuesta = $servidor->handle();
|
|
|
echo $respuesta;
|
|
echo $respuesta;
|
|
|
]]></programlisting>
|
|
]]></programlisting>
|
|
|
|
|
|
|
|
- <para> También puede combinar y examinar la identidad de varias clases y
|
|
|
|
|
|
|
+ <para>También puede combinar y examinar la identidad de varias clases y
|
|
|
funciones. Al hacerlo, sugerimos darle un espacio de nombres a cada
|
|
funciones. Al hacerlo, sugerimos darle un espacio de nombres a cada
|
|
|
una para garantizar que no ocurran colisiones entre nombres de
|
|
una para garantizar que no ocurran colisiones entre nombres de
|
|
|
métodos; puede hacerse simplemente pasando una segunda cadena de
|
|
métodos; puede hacerse simplemente pasando una segunda cadena de
|
|
|
argumentos para cualquier <methodname>addFunction()</methodname> o
|
|
argumentos para cualquier <methodname>addFunction()</methodname> o
|
|
|
- <methodname>setClass()</methodname>: </para>
|
|
|
|
|
|
|
+ <methodname>setClass()</methodname>:</para>
|
|
|
|
|
|
|
|
<programlisting language="php"><![CDATA[
|
|
<programlisting language="php"><![CDATA[
|
|
|
$servidor = new Zend_Amf_Server();
|
|
$servidor = new Zend_Amf_Server();
|
|
@@ -52,21 +52,21 @@ $respuesta = $servidor->handle();
|
|
|
echo $respuesta;
|
|
echo $respuesta;
|
|
|
]]></programlisting>
|
|
]]></programlisting>
|
|
|
|
|
|
|
|
- <para> El <classname>Zend_Amf_Server</classname> también permite cargar
|
|
|
|
|
|
|
+ <para>El <classname>Zend_Amf_Server</classname> también permite cargar
|
|
|
servicios dinámicamente, en función de una ruta de directorio ya
|
|
servicios dinámicamente, en función de una ruta de directorio ya
|
|
|
suministrada. Puede añadir al servidor tantos directorios como
|
|
suministrada. Puede añadir al servidor tantos directorios como
|
|
|
desee. El orden en que se añadan los directorios al servidor será el
|
|
desee. El orden en que se añadan los directorios al servidor será el
|
|
|
orden en que se realizarán las búsquedas <acronym>LIFO</acronym> en
|
|
orden en que se realizarán las búsquedas <acronym>LIFO</acronym> en
|
|
|
los directorios para coincidir con la clase. El método
|
|
los directorios para coincidir con la clase. El método
|
|
|
<methodname>addDirectory()</methodname> realiza la acción de
|
|
<methodname>addDirectory()</methodname> realiza la acción de
|
|
|
- añadir directorios. </para>
|
|
|
|
|
|
|
+ añadir directorios.</para>
|
|
|
|
|
|
|
|
<programlisting language="php"><![CDATA[
|
|
<programlisting language="php"><![CDATA[
|
|
|
$servidor->addDirectory(dirname(__FILE__) .'/../services/');
|
|
$servidor->addDirectory(dirname(__FILE__) .'/../services/');
|
|
|
$servidor->addDirectory(dirname(__FILE__) .'/../package/');
|
|
$servidor->addDirectory(dirname(__FILE__) .'/../package/');
|
|
|
]]></programlisting>
|
|
]]></programlisting>
|
|
|
|
|
|
|
|
- <para> Cuando se llama a servicios remotos, los nombres de los
|
|
|
|
|
|
|
+ <para>Cuando se llama a servicios remotos, los nombres de los
|
|
|
directorios que contengan las fuentes pueden tener los delimitadores
|
|
directorios que contengan las fuentes pueden tener los delimitadores
|
|
|
guión bajo ("_") y el punto ("."). Cuando se utilize un guión bajo
|
|
guión bajo ("_") y el punto ("."). Cuando se utilize un guión bajo
|
|
|
("_") tanto en <acronym>PEAR</acronym> como en Zend Framework, se
|
|
("_") tanto en <acronym>PEAR</acronym> como en Zend Framework, se
|
|
@@ -78,22 +78,22 @@ $servidor->addDirectory(dirname(__FILE__) .'/../package/');
|
|
|
para su servicio remoto como <filename>com.Foo.Bar</filename> cada
|
|
para su servicio remoto como <filename>com.Foo.Bar</filename> cada
|
|
|
ruta incluida deberá tener <filename>com/Foo/Bar.php</filename>
|
|
ruta incluida deberá tener <filename>com/Foo/Bar.php</filename>
|
|
|
agregado al final para autocargar <filename>Bar.php</filename>
|
|
agregado al final para autocargar <filename>Bar.php</filename>
|
|
|
- </para>
|
|
|
|
|
|
|
+ </para>
|
|
|
|
|
|
|
|
- <para> Todos las solicitudes <acronym>AMF</acronym> enviadas al script
|
|
|
|
|
|
|
+ <para>Todos las solicitudes <acronym>AMF</acronym> enviadas al script
|
|
|
serán manejadas por el servidor, y este devolverá una respuesta
|
|
serán manejadas por el servidor, y este devolverá una respuesta
|
|
|
- <acronym>AMF</acronym>. </para>
|
|
|
|
|
|
|
+ <acronym>AMF</acronym>.</para>
|
|
|
</example>
|
|
</example>
|
|
|
|
|
|
|
|
<note>
|
|
<note>
|
|
|
<title>Todos los métodos y las funciones agregadas requieren bloques de
|
|
<title>Todos los métodos y las funciones agregadas requieren bloques de
|
|
|
documentación (docblocks)</title>
|
|
documentación (docblocks)</title>
|
|
|
|
|
|
|
|
- <para> Como todos los demás componentes del servidor en Zend Framework,
|
|
|
|
|
|
|
+ <para>Como todos los demás componentes del servidor en Zend Framework,
|
|
|
debe documentar los métodos de su clase usando
|
|
debe documentar los métodos de su clase usando
|
|
|
<acronym>PHP</acronym> docblocks. Como mínimo, necesita
|
|
<acronym>PHP</acronym> docblocks. Como mínimo, necesita
|
|
|
proporcionar anotaciones para cada argumento así como para el valor
|
|
proporcionar anotaciones para cada argumento así como para el valor
|
|
|
- de retorno. Como ejemplos: </para>
|
|
|
|
|
|
|
+ de retorno. Como ejemplos:</para>
|
|
|
|
|
|
|
|
<programlisting language="php"><![CDATA[
|
|
<programlisting language="php"><![CDATA[
|
|
|
// Función que agregar:
|
|
// Función que agregar:
|
|
@@ -126,25 +126,25 @@ class Mundo
|
|
|
}
|
|
}
|
|
|
]]></programlisting>
|
|
]]></programlisting>
|
|
|
|
|
|
|
|
- <para> Pueden usarse otras anotaciones, pero serán ignoradas. </para>
|
|
|
|
|
|
|
+ <para>Pueden usarse otras anotaciones, pero serán ignoradas.</para>
|
|
|
</note>
|
|
</note>
|
|
|
|
|
|
|
|
<sect2 id="zend.amf.server.flex">
|
|
<sect2 id="zend.amf.server.flex">
|
|
|
<title>Conectándose al Servidor desde Flex</title>
|
|
<title>Conectándose al Servidor desde Flex</title>
|
|
|
|
|
|
|
|
- <para> Conectarse a <classname>Zend_Amf_Server</classname> desde su
|
|
|
|
|
|
|
+ <para>Conectarse a <classname>Zend_Amf_Server</classname> desde su
|
|
|
proyecto Flex es bastante simple; solo necesita apuntar el final del
|
|
proyecto Flex es bastante simple; solo necesita apuntar el final del
|
|
|
<acronym>URI</acronym> a su script
|
|
<acronym>URI</acronym> a su script
|
|
|
- <classname>Zend_Amf_Server</classname>. </para>
|
|
|
|
|
|
|
+ <classname>Zend_Amf_Server</classname>.</para>
|
|
|
|
|
|
|
|
- <para> Por ejemplo, digamos que ya ha creado su servidor y lo ha puesto
|
|
|
|
|
|
|
+ <para>Por ejemplo, digamos que ya ha creado su servidor y lo ha puesto
|
|
|
en el fichero <filename>server.php</filename> en el directorio raíz
|
|
en el fichero <filename>server.php</filename> en el directorio raíz
|
|
|
(root) de su aplicación, por lo tanto la <acronym>URI</acronym> es
|
|
(root) de su aplicación, por lo tanto la <acronym>URI</acronym> es
|
|
|
<filename>http://example.com/server.php</filename>. En este
|
|
<filename>http://example.com/server.php</filename>. En este
|
|
|
caso, usted debería modificar su fichero
|
|
caso, usted debería modificar su fichero
|
|
|
<filename>service-config.xml</filename> poniendo este valor como
|
|
<filename>service-config.xml</filename> poniendo este valor como
|
|
|
- atributo al punto final del canal<acronym>URI</acronym>. </para>
|
|
|
|
|
- <para> Si nunca ha creado un fichero
|
|
|
|
|
|
|
+ atributo al punto final del canal<acronym>URI</acronym>.</para>
|
|
|
|
|
+ <para>Si nunca ha creado un fichero
|
|
|
<filename>service-config.xml</filename> puede hacerlo abriendo
|
|
<filename>service-config.xml</filename> puede hacerlo abriendo
|
|
|
su proyecto en la ventana del navegador. Haga clic derecho sobre el
|
|
su proyecto en la ventana del navegador. Haga clic derecho sobre el
|
|
|
nombre del proyecto y seleccione 'properties' (propiedades). En el
|
|
nombre del proyecto y seleccione 'properties' (propiedades). En el
|
|
@@ -152,8 +152,8 @@ class Mundo
|
|
|
Path' (Crear ruta Flex), luego en la pestaña ‘Library path’ (ruta de
|
|
Path' (Crear ruta Flex), luego en la pestaña ‘Library path’ (ruta de
|
|
|
biblioteca) asegúrese de que el fichero
|
|
biblioteca) asegúrese de que el fichero
|
|
|
'<filename>rpc.swc</filename>' sea añadido a su ruta de
|
|
'<filename>rpc.swc</filename>' sea añadido a su ruta de
|
|
|
- proyectos y pulse Ok (Aceptar) para cerrar la ventana. </para>
|
|
|
|
|
- <para> También necesitará indicarle al compilador que debe usar
|
|
|
|
|
|
|
+ proyectos y pulse Ok (Aceptar) para cerrar la ventana.</para>
|
|
|
|
|
+ <para>También necesitará indicarle al compilador que debe usar
|
|
|
<filename>service-config.xml</filename> para encontrar el punto
|
|
<filename>service-config.xml</filename> para encontrar el punto
|
|
|
final de RemoteObject. Para hacerlo, abra de nuevo el panel de
|
|
final de RemoteObject. Para hacerlo, abra de nuevo el panel de
|
|
|
propiedades de su proyecto haciendo clic en el botón derecho sobre
|
|
propiedades de su proyecto haciendo clic en el botón derecho sobre
|
|
@@ -164,8 +164,8 @@ class Mundo
|
|
|
opción. Lo que acaba de hacer es decirle al compilador Flex que
|
|
opción. Lo que acaba de hacer es decirle al compilador Flex que
|
|
|
busque en el fichero <filename>services-config.xml</filename>
|
|
busque en el fichero <filename>services-config.xml</filename>
|
|
|
aquellas variables que se usarán en tiempo de ejecución por la clase
|
|
aquellas variables que se usarán en tiempo de ejecución por la clase
|
|
|
- RemotingObject. </para>
|
|
|
|
|
- <para> Ahora, para conectarnos a nuestros métodos remotos debemos
|
|
|
|
|
|
|
+ RemotingObject.</para>
|
|
|
|
|
+ <para>Ahora, para conectarnos a nuestros métodos remotos debemos
|
|
|
indicarle a Flex qué fichero de configuración de servicios utilizar.
|
|
indicarle a Flex qué fichero de configuración de servicios utilizar.
|
|
|
Por esta razón creamos un nuevo fichero
|
|
Por esta razón creamos un nuevo fichero
|
|
|
'<filename>services-config.xml</filename>' en la carpeta src del
|
|
'<filename>services-config.xml</filename>' en la carpeta src del
|
|
@@ -173,13 +173,13 @@ class Mundo
|
|
|
'new'(nuevo) 'File' (fichero), se abrirá una nueva ventana.
|
|
'new'(nuevo) 'File' (fichero), se abrirá una nueva ventana.
|
|
|
Seleccione la carpeta del proyecto y luego nombre el archivo
|
|
Seleccione la carpeta del proyecto y luego nombre el archivo
|
|
|
'<filename>services-config.xml</filename>' y presione 'finish'
|
|
'<filename>services-config.xml</filename>' y presione 'finish'
|
|
|
- (finalizar). </para>
|
|
|
|
|
- <para> Flex ha creado y abierto el nuevo fichero
|
|
|
|
|
|
|
+ (finalizar).</para>
|
|
|
|
|
+ <para>Flex ha creado y abierto el nuevo fichero
|
|
|
<filename>services-config.xml</filename>. Utilice el siguiente
|
|
<filename>services-config.xml</filename>. Utilice el siguiente
|
|
|
texto de ejemplo para su fichero
|
|
texto de ejemplo para su fichero
|
|
|
<filename>services-config.xml</filename>. Asegúrese de
|
|
<filename>services-config.xml</filename>. Asegúrese de
|
|
|
actualizar su punto final para que concuerde con el servidor.
|
|
actualizar su punto final para que concuerde con el servidor.
|
|
|
- Asegúrese también de guardar el fichero. </para>
|
|
|
|
|
|
|
+ Asegúrese también de guardar el fichero.</para>
|
|
|
|
|
|
|
|
<programlisting language="xml"><![CDATA[
|
|
<programlisting language="xml"><![CDATA[
|
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
@@ -208,10 +208,10 @@ class Mundo
|
|
|
</services-config>
|
|
</services-config>
|
|
|
]]></programlisting>
|
|
]]></programlisting>
|
|
|
|
|
|
|
|
- <para> Hay dos puntos clave en el ejemplo. En primer lugar, pero último
|
|
|
|
|
|
|
+ <para>Hay dos puntos clave en el ejemplo. En primer lugar, pero último
|
|
|
en el listado, creamos un canal <acronym>AMF</acronym>, y
|
|
en el listado, creamos un canal <acronym>AMF</acronym>, y
|
|
|
especificamos el punto final como la <acronym>URL</acronym> a
|
|
especificamos el punto final como la <acronym>URL</acronym> a
|
|
|
- nuestro <classname>Zend_Amf_Server</classname>: </para>
|
|
|
|
|
|
|
+ nuestro <classname>Zend_Amf_Server</classname>:</para>
|
|
|
|
|
|
|
|
<programlisting language="xml"><![CDATA[
|
|
<programlisting language="xml"><![CDATA[
|
|
|
<channel-definition id="zend-endpoint"
|
|
<channel-definition id="zend-endpoint"
|
|
@@ -220,14 +220,14 @@ class Mundo
|
|
|
</channel-definition>
|
|
</channel-definition>
|
|
|
]]></programlisting>
|
|
]]></programlisting>
|
|
|
|
|
|
|
|
- <para> Advierta que a este canal le hemos dado un identificador,
|
|
|
|
|
|
|
+ <para>Advierta que a este canal le hemos dado un identificador,
|
|
|
"zend-endpoint". El ejemplo crea un servicio cuyo destino hace
|
|
"zend-endpoint". El ejemplo crea un servicio cuyo destino hace
|
|
|
referencia a este canal, asignándole también un ID, en este caso es
|
|
referencia a este canal, asignándole también un ID, en este caso es
|
|
|
- "zend". </para>
|
|
|
|
|
|
|
+ "zend".</para>
|
|
|
|
|
|
|
|
- <para> Dentro de nuestros ficheros Flex <acronym>MXML</acronym>,
|
|
|
|
|
|
|
+ <para>Dentro de nuestros ficheros Flex <acronym>MXML</acronym>,
|
|
|
necesitamos vincular un RemoteObject al servicio. En
|
|
necesitamos vincular un RemoteObject al servicio. En
|
|
|
- <acronym>MXML</acronym>, esto podría hacerse así: </para>
|
|
|
|
|
|
|
+ <acronym>MXML</acronym>, esto podría hacerse así:</para>
|
|
|
|
|
|
|
|
<programlisting language="xml"><![CDATA[
|
|
<programlisting language="xml"><![CDATA[
|
|
|
<mx:RemoteObject id="myservice"
|
|
<mx:RemoteObject id="myservice"
|
|
@@ -236,53 +236,53 @@ class Mundo
|
|
|
destination="zend">
|
|
destination="zend">
|
|
|
]]></programlisting>
|
|
]]></programlisting>
|
|
|
|
|
|
|
|
- <para> Aquí, hemos definido un nuevo objeto remoto identificado por
|
|
|
|
|
|
|
+ <para>Aquí, hemos definido un nuevo objeto remoto identificado por
|
|
|
"myservice" vinculado destino de servicio "zend" que hemos definido
|
|
"myservice" vinculado destino de servicio "zend" que hemos definido
|
|
|
en el fichero <filename>services-config.xml</filename>. Entonces
|
|
en el fichero <filename>services-config.xml</filename>. Entonces
|
|
|
invocamos sus métodos en nuestro ActionScript simplemente llamando a
|
|
invocamos sus métodos en nuestro ActionScript simplemente llamando a
|
|
|
- "myservice.<method>". . A modo de ejemplo: </para>
|
|
|
|
|
|
|
+ "myservice.<method>". . A modo de ejemplo:</para>
|
|
|
|
|
|
|
|
<programlisting language="ActionScript"><![CDATA[
|
|
<programlisting language="ActionScript"><![CDATA[
|
|
|
myservice.hello("Wade");
|
|
myservice.hello("Wade");
|
|
|
]]></programlisting>
|
|
]]></programlisting>
|
|
|
|
|
|
|
|
- <para> Cuando se usan nombres-de-espacio, puede usarse
|
|
|
|
|
- "myservice.<namespace>.<method>": </para>
|
|
|
|
|
|
|
+ <para>Cuando se usan nombres-de-espacio, puede usarse
|
|
|
|
|
+ "myservice.<namespace>.<method>":</para>
|
|
|
|
|
|
|
|
<programlisting language="ActionScript"><![CDATA[
|
|
<programlisting language="ActionScript"><![CDATA[
|
|
|
myservice.world.hello("Wade");
|
|
myservice.world.hello("Wade");
|
|
|
]]></programlisting>
|
|
]]></programlisting>
|
|
|
|
|
|
|
|
- <para> Para más información sobre como invocar a Flex RemoteObject
|
|
|
|
|
|
|
+ <para>Para más información sobre como invocar a Flex RemoteObject
|
|
|
visite el sitio de ayuda de Adobe Flex 3 en:<ulink
|
|
visite el sitio de ayuda de Adobe Flex 3 en:<ulink
|
|
|
url="http://livedocs.adobe.com/flex/3/html/help.html?content=data_access_4.html"
|
|
url="http://livedocs.adobe.com/flex/3/html/help.html?content=data_access_4.html"
|
|
|
- />. </para>
|
|
|
|
|
|
|
+ />.</para>
|
|
|
</sect2>
|
|
</sect2>
|
|
|
|
|
|
|
|
<sect2 id="zend.amf.server.errors">
|
|
<sect2 id="zend.amf.server.errors">
|
|
|
<title>Manejo de errores</title>
|
|
<title>Manejo de errores</title>
|
|
|
|
|
|
|
|
- <para> Por defecto, todas las excepciones producidas en sus clases o
|
|
|
|
|
|
|
+ <para>Por defecto, todas las excepciones producidas en sus clases o
|
|
|
funciones adjuntas serán capturados y devueltas como mensajes de
|
|
funciones adjuntas serán capturados y devueltas como mensajes de
|
|
|
error de <acronym>AMF</acronym> (AMF ErrorMessages). Sin embargo, el
|
|
error de <acronym>AMF</acronym> (AMF ErrorMessages). Sin embargo, el
|
|
|
contenido de estos objetos de mensajes de error variará dependiendo
|
|
contenido de estos objetos de mensajes de error variará dependiendo
|
|
|
de si el servidor está o no en modo "producción" (el estado por
|
|
de si el servidor está o no en modo "producción" (el estado por
|
|
|
- defecto). </para>
|
|
|
|
|
|
|
+ defecto).</para>
|
|
|
|
|
|
|
|
- <para> Cuando se está en modo de producción, únicamente el código de
|
|
|
|
|
|
|
+ <para>Cuando se está en modo de producción, únicamente el código de
|
|
|
excepción será devuelto. Si desactiva el modo de producción, algo
|
|
excepción será devuelto. Si desactiva el modo de producción, algo
|
|
|
que debe hacerse sólo para probar -- serán devueltos más detalles de
|
|
que debe hacerse sólo para probar -- serán devueltos más detalles de
|
|
|
la excepción: el mensaje de excepción (error), línea y backtrace
|
|
la excepción: el mensaje de excepción (error), línea y backtrace
|
|
|
- serán adjuntados. </para>
|
|
|
|
|
|
|
+ serán adjuntados.</para>
|
|
|
|
|
|
|
|
- <para> Para desactivar el modo de producción, haga lo siguiente: </para>
|
|
|
|
|
|
|
+ <para>Para desactivar el modo de producción, haga lo siguiente:</para>
|
|
|
|
|
|
|
|
<programlisting language="php"><![CDATA[
|
|
<programlisting language="php"><![CDATA[
|
|
|
$server->setProduction(false);
|
|
$server->setProduction(false);
|
|
|
]]></programlisting>
|
|
]]></programlisting>
|
|
|
|
|
|
|
|
- <para> Para habilitarlo nuevamente, pase el valor
|
|
|
|
|
- <constant>TRUE</constant> en su lugar. </para>
|
|
|
|
|
|
|
+ <para>Para habilitarlo nuevamente, pase el valor
|
|
|
|
|
+ <constant>TRUE</constant> en su lugar.</para>
|
|
|
|
|
|
|
|
<programlisting language="php"><![CDATA[
|
|
<programlisting language="php"><![CDATA[
|
|
|
$server->setProduction(true);
|
|
$server->setProduction(true);
|
|
@@ -291,16 +291,16 @@ $server->setProduction(true);
|
|
|
<note>
|
|
<note>
|
|
|
<title>¡Deshabilite el modo de producción racionalmente!</title>
|
|
<title>¡Deshabilite el modo de producción racionalmente!</title>
|
|
|
|
|
|
|
|
- <para> Sugerimos deshabilitar el modo de producción solo cuando se
|
|
|
|
|
|
|
+ <para>Sugerimos deshabilitar el modo de producción solo cuando se
|
|
|
está en modo de desarrollo. Los mensajes de excepción y los
|
|
está en modo de desarrollo. Los mensajes de excepción y los
|
|
|
backtraces puede contener información sensible del sistema, y no
|
|
backtraces puede contener información sensible del sistema, y no
|
|
|
desea que se pueda acceder a ellas desde el exterior. Aunque
|
|
desea que se pueda acceder a ellas desde el exterior. Aunque
|
|
|
<acronym>AMF</acronym> es un formato binario, ahora al ser
|
|
<acronym>AMF</acronym> es un formato binario, ahora al ser
|
|
|
abierta la especificación, cualquiera puede potencialmente
|
|
abierta la especificación, cualquiera puede potencialmente
|
|
|
- deserializar los datos. </para>
|
|
|
|
|
|
|
+ deserializar los datos.</para>
|
|
|
</note>
|
|
</note>
|
|
|
|
|
|
|
|
- <para> Un área en la que se debe tener especialmente mucho cuidado son
|
|
|
|
|
|
|
+ <para>Un área en la que se debe tener especialmente mucho cuidado son
|
|
|
los errores propios de <acronym>PHP</acronym>. Cuando la directiva
|
|
los errores propios de <acronym>PHP</acronym>. Cuando la directiva
|
|
|
<acronym>INI</acronym>
|
|
<acronym>INI</acronym>
|
|
|
<property>display_errors</property> está habilitada, los errores de
|
|
<property>display_errors</property> está habilitada, los errores de
|
|
@@ -309,24 +309,24 @@ $server->setProduction(true);
|
|
|
hacer estragos con las respuestas de <acronym>AMF</acronym>. Para
|
|
hacer estragos con las respuestas de <acronym>AMF</acronym>. Para
|
|
|
prevenir estos problemas, sugerimos deshabilitar la directiva
|
|
prevenir estos problemas, sugerimos deshabilitar la directiva
|
|
|
<property>display_errors</property> cuando se está en modo de
|
|
<property>display_errors</property> cuando se está en modo de
|
|
|
- producción. </para>
|
|
|
|
|
|
|
+ producción.</para>
|
|
|
</sect2>
|
|
</sect2>
|
|
|
|
|
|
|
|
<sect2 id="zend.amf.server.response">
|
|
<sect2 id="zend.amf.server.response">
|
|
|
<title>Respuestas de AMF</title>
|
|
<title>Respuestas de AMF</title>
|
|
|
|
|
|
|
|
- <para> En ocasiones es posible que quiera manipular ligeramente el
|
|
|
|
|
|
|
+ <para>En ocasiones es posible que quiera manipular ligeramente el
|
|
|
objeto respuesta, es bastante usual querer devolver algunas
|
|
objeto respuesta, es bastante usual querer devolver algunas
|
|
|
cebeceras de mensajes adicionales. Puede hacerlo mediante el método
|
|
cebeceras de mensajes adicionales. Puede hacerlo mediante el método
|
|
|
del servidor <methodname>handle()</methodname> que devuelve el
|
|
del servidor <methodname>handle()</methodname> que devuelve el
|
|
|
- objeto respuesta. </para>
|
|
|
|
|
|
|
+ objeto respuesta.</para>
|
|
|
|
|
|
|
|
<example id="zend.amf.server.response.messageHeaderExample">
|
|
<example id="zend.amf.server.response.messageHeaderExample">
|
|
|
<title>Agregar cabeceras de mensaje a la respuesta de AMF</title>
|
|
<title>Agregar cabeceras de mensaje a la respuesta de AMF</title>
|
|
|
|
|
|
|
|
- <para> En este ejemplo, añadiremos la cabecera de mensaje
|
|
|
|
|
|
|
+ <para>En este ejemplo, añadiremos la cabecera de mensaje
|
|
|
(MessageHeader) "foo" con el valor 'bar' a la respuesta antes de
|
|
(MessageHeader) "foo" con el valor 'bar' a la respuesta antes de
|
|
|
- devolverla. </para>
|
|
|
|
|
|
|
+ devolverla.</para>
|
|
|
|
|
|
|
|
<programlisting language="php"><![CDATA[
|
|
<programlisting language="php"><![CDATA[
|
|
|
$respuesta = $servidor->handle();
|
|
$respuesta = $servidor->handle();
|
|
@@ -339,22 +339,22 @@ echo $respuesta;
|
|
|
<sect2 id="zend.amf.server.typedobjects">
|
|
<sect2 id="zend.amf.server.typedobjects">
|
|
|
<title>Objetos tipados</title>
|
|
<title>Objetos tipados</title>
|
|
|
|
|
|
|
|
- <para> Similarmente a <acronym>SOAP</acronym>, <acronym>AMF</acronym>
|
|
|
|
|
|
|
+ <para>Similarmente a <acronym>SOAP</acronym>, <acronym>AMF</acronym>
|
|
|
permite pasar objetos entre cliente y servidor. Esto le da una gran
|
|
permite pasar objetos entre cliente y servidor. Esto le da una gran
|
|
|
- flexibilidad y coherencia a ambos entornos. </para>
|
|
|
|
|
|
|
+ flexibilidad y coherencia a ambos entornos.</para>
|
|
|
|
|
|
|
|
- <para>
|
|
|
|
|
|
|
+ <para>
|
|
|
<methodname>Zend_Amf</methodname> ofrece tres métodos para mapear
|
|
<methodname>Zend_Amf</methodname> ofrece tres métodos para mapear
|
|
|
- ActionScript y objetos <acronym>PHP</acronym>. </para>
|
|
|
|
|
|
|
+ ActionScript y objetos <acronym>PHP</acronym>.</para>
|
|
|
|
|
|
|
|
<itemizedlist>
|
|
<itemizedlist>
|
|
|
<listitem>
|
|
<listitem>
|
|
|
- <para> Primero, usted puede crear uniones explícitas a nivel del
|
|
|
|
|
|
|
+ <para>Primero, usted puede crear uniones explícitas a nivel del
|
|
|
servidor, utilizando el método
|
|
servidor, utilizando el método
|
|
|
<methodname>setClassMap()</methodname>. El primer
|
|
<methodname>setClassMap()</methodname>. El primer
|
|
|
argumento es el nombre de la clase de ActionScript, el
|
|
argumento es el nombre de la clase de ActionScript, el
|
|
|
segundo es el nombre de la clase <acronym>PHP</acronym> que
|
|
segundo es el nombre de la clase <acronym>PHP</acronym> que
|
|
|
- lo mapea: </para>
|
|
|
|
|
|
|
+ lo mapea:</para>
|
|
|
|
|
|
|
|
<programlisting language="php"><![CDATA[
|
|
<programlisting language="php"><![CDATA[
|
|
|
// Mapea la clase ActionScript 'ContactVO' a la clase PHP 'Contact':
|
|
// Mapea la clase ActionScript 'ContactVO' a la clase PHP 'Contact':
|
|
@@ -363,10 +363,10 @@ $servidor->setClassMap('ContactVO', 'Contact');
|
|
|
</listitem>
|
|
</listitem>
|
|
|
|
|
|
|
|
<listitem>
|
|
<listitem>
|
|
|
- <para> Segundo, en su clase <acronym>PHP</acronym> puede ajustar
|
|
|
|
|
|
|
+ <para>Segundo, en su clase <acronym>PHP</acronym> puede ajustar
|
|
|
la propiedad como pública mediante
|
|
la propiedad como pública mediante
|
|
|
<varname>$_explicitType</varname>, con el valor
|
|
<varname>$_explicitType</varname>, con el valor
|
|
|
- representativo de la clase ActionScript que mapear: </para>
|
|
|
|
|
|
|
+ representativo de la clase ActionScript que mapear:</para>
|
|
|
|
|
|
|
|
<programlisting language="php"><![CDATA[
|
|
<programlisting language="php"><![CDATA[
|
|
|
class Contact
|
|
class Contact
|
|
@@ -377,10 +377,10 @@ class Contact
|
|
|
</listitem>
|
|
</listitem>
|
|
|
|
|
|
|
|
<listitem>
|
|
<listitem>
|
|
|
- <para> Tercero, en un sentido similar, puede definir como
|
|
|
|
|
|
|
+ <para>Tercero, en un sentido similar, puede definir como
|
|
|
público el método <methodname>getASClassName()</methodname>
|
|
público el método <methodname>getASClassName()</methodname>
|
|
|
dentro de su clase. Este método debe devolver la clase
|
|
dentro de su clase. Este método debe devolver la clase
|
|
|
- ActionScript apropiada: </para>
|
|
|
|
|
|
|
+ ActionScript apropiada:</para>
|
|
|
|
|
|
|
|
<programlisting language="php"><![CDATA[
|
|
<programlisting language="php"><![CDATA[
|
|
|
class Contact
|
|
class Contact
|
|
@@ -394,14 +394,14 @@ class Contact
|
|
|
</listitem>
|
|
</listitem>
|
|
|
</itemizedlist>
|
|
</itemizedlist>
|
|
|
|
|
|
|
|
- <para> Aunque hemos creado <emphasis>ContactVO</emphasis> en el
|
|
|
|
|
|
|
+ <para>Aunque hemos creado <emphasis>ContactVO</emphasis> en el
|
|
|
servidor, ahora tenemos que hacer su clase correspondiente en
|
|
servidor, ahora tenemos que hacer su clase correspondiente en
|
|
|
<acronym>AS3</acronym> para que el servidor pueda mapear el
|
|
<acronym>AS3</acronym> para que el servidor pueda mapear el
|
|
|
- objeto. </para>
|
|
|
|
|
- <para> Haga clic derecho sobre la carpeta src del proyecto Flex y
|
|
|
|
|
|
|
+ objeto.</para>
|
|
|
|
|
+ <para>Haga clic derecho sobre la carpeta src del proyecto Flex y
|
|
|
seleccione New -> ActionScript File. Nombre el fichero como
|
|
seleccione New -> ActionScript File. Nombre el fichero como
|
|
|
ContactVO y pulse 'finish' (finalizar) para verlo. Copie el
|
|
ContactVO y pulse 'finish' (finalizar) para verlo. Copie el
|
|
|
- siguiente código en el fichero para terminar de crear la clase. </para>
|
|
|
|
|
|
|
+ siguiente código en el fichero para terminar de crear la clase.</para>
|
|
|
<programlisting language="as"><![CDATA[
|
|
<programlisting language="as"><![CDATA[
|
|
|
package
|
|
package
|
|
|
{
|
|
{
|
|
@@ -419,7 +419,7 @@ package
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
]]></programlisting>
|
|
]]></programlisting>
|
|
|
- <para> La clase es sintácticamente equivalente a la de
|
|
|
|
|
|
|
+ <para>La clase es sintácticamente equivalente a la de
|
|
|
<acronym>PHP</acronym> del mismo nombre. Los nombres de
|
|
<acronym>PHP</acronym> del mismo nombre. Los nombres de
|
|
|
variables son exactamente los mismos y necesitan estar en el mismo
|
|
variables son exactamente los mismos y necesitan estar en el mismo
|
|
|
contenedor para trabajar correctamente. Hay dos meta tags
|
|
contenedor para trabajar correctamente. Hay dos meta tags
|
|
@@ -429,7 +429,7 @@ package
|
|
|
objeto remoto con un nombre de alias, en este caso
|
|
objeto remoto con un nombre de alias, en este caso
|
|
|
<emphasis>ContactVO</emphasis> Es obligatorio que en esta
|
|
<emphasis>ContactVO</emphasis> Es obligatorio que en esta
|
|
|
etiqueta(tag), el valor que se estableció es la clase
|
|
etiqueta(tag), el valor que se estableció es la clase
|
|
|
- <acronym>PHP</acronym> sea estrictamente equivalente. </para>
|
|
|
|
|
|
|
+ <acronym>PHP</acronym> sea estrictamente equivalente.</para>
|
|
|
<programlisting language="as"><![CDATA[
|
|
<programlisting language="as"><![CDATA[
|
|
|
[Bindable]
|
|
[Bindable]
|
|
|
private var myContact:ContactVO;
|
|
private var myContact:ContactVO;
|
|
@@ -438,22 +438,22 @@ private function getContactHandler(event:ResultEvent):void {
|
|
|
myContact = ContactVO(event.result);
|
|
myContact = ContactVO(event.result);
|
|
|
}
|
|
}
|
|
|
]]></programlisting>
|
|
]]></programlisting>
|
|
|
- <para> El siguiente resultado del evento debido a la llamada de
|
|
|
|
|
|
|
+ <para>El siguiente resultado del evento debido a la llamada de
|
|
|
servicio, se incorporó instantáneamente a
|
|
servicio, se incorporó instantáneamente a
|
|
|
<emphasis>ContactVO</emphasis> de Flex. Cualquier cosa que esté
|
|
<emphasis>ContactVO</emphasis> de Flex. Cualquier cosa que esté
|
|
|
ligada a myContact será actualizada con los datos retornados por
|
|
ligada a myContact será actualizada con los datos retornados por
|
|
|
- <emphasis>ContactVO</emphasis>. </para>
|
|
|
|
|
|
|
+ <emphasis>ContactVO</emphasis>.</para>
|
|
|
</sect2>
|
|
</sect2>
|
|
|
|
|
|
|
|
<sect2 id="zend.amf.server.resources">
|
|
<sect2 id="zend.amf.server.resources">
|
|
|
<title>Recursos</title>
|
|
<title>Recursos</title>
|
|
|
|
|
|
|
|
- <para>
|
|
|
|
|
|
|
+ <para>
|
|
|
<classname>Zend_Amf</classname> provides tools for mapping resource
|
|
<classname>Zend_Amf</classname> provides tools for mapping resource
|
|
|
types returned by service classes into data consumable by
|
|
types returned by service classes into data consumable by
|
|
|
- ActionScript. </para>
|
|
|
|
|
|
|
+ ActionScript.</para>
|
|
|
|
|
|
|
|
- <para> In order to handle specific resource type, the user needs to
|
|
|
|
|
|
|
+ <para>In order to handle specific resource type, the user needs to
|
|
|
create a plugin class named after the resource name, with words
|
|
create a plugin class named after the resource name, with words
|
|
|
capitalized and spaces removed (so, resource type "mysql result"
|
|
capitalized and spaces removed (so, resource type "mysql result"
|
|
|
becomes MysqlResult), with some prefix, e.g.
|
|
becomes MysqlResult), with some prefix, e.g.
|
|
@@ -462,10 +462,10 @@ private function getContactHandler(event:ResultEvent):void {
|
|
|
one argument - the resource - and returning the value that should be
|
|
one argument - the resource - and returning the value that should be
|
|
|
sent to ActionScript. The class should be located in the file named
|
|
sent to ActionScript. The class should be located in the file named
|
|
|
after the last component of the name, e.g.
|
|
after the last component of the name, e.g.
|
|
|
- <filename>MysqlResult.php</filename>. </para>
|
|
|
|
|
|
|
+ <filename>MysqlResult.php</filename>.</para>
|
|
|
|
|
|
|
|
- <para> The directory containing the resource handling plugins should be
|
|
|
|
|
- registered with <classname>Zend_Amf</classname> type loader: </para>
|
|
|
|
|
|
|
+ <para>The directory containing the resource handling plugins should be
|
|
|
|
|
+ registered with <classname>Zend_Amf</classname> type loader:</para>
|
|
|
|
|
|
|
|
<programlisting language="php"><![CDATA[
|
|
<programlisting language="php"><![CDATA[
|
|
|
Zend_Amf_Parse_TypeLoader::addResourceDirectory(
|
|
Zend_Amf_Parse_TypeLoader::addResourceDirectory(
|
|
@@ -474,12 +474,12 @@ Zend_Amf_Parse_TypeLoader::addResourceDirectory(
|
|
|
));
|
|
));
|
|
|
]]></programlisting>
|
|
]]></programlisting>
|
|
|
|
|
|
|
|
- <para> For detailed discussion of loading plugins, please see the <link
|
|
|
|
|
- linkend="zend.loader.pluginloader">plugin loader</link> section. </para>
|
|
|
|
|
|
|
+ <para>For detailed discussion of loading plugins, please see the <link
|
|
|
|
|
+ linkend="zend.loader.pluginloader">plugin loader</link> section.</para>
|
|
|
|
|
|
|
|
- <para> Default directory for <classname>Zend_Amf</classname> resources
|
|
|
|
|
|
|
+ <para>Default directory for <classname>Zend_Amf</classname> resources
|
|
|
is registered automatically and currently contains handlers for
|
|
is registered automatically and currently contains handlers for
|
|
|
- "mysql result" and "stream" resources. </para>
|
|
|
|
|
|
|
+ "mysql result" and "stream" resources.</para>
|
|
|
|
|
|
|
|
<programlisting language="php"><![CDATA[
|
|
<programlisting language="php"><![CDATA[
|
|
|
// Example class implementing handling resources of type mysql result
|
|
// Example class implementing handling resources of type mysql result
|
|
@@ -501,8 +501,8 @@ class Zend_Amf_Parse_Resource_MysqlResult
|
|
|
}
|
|
}
|
|
|
]]></programlisting>
|
|
]]></programlisting>
|
|
|
|
|
|
|
|
- <para> Trying to return unknown resource type (i.e., one for which no
|
|
|
|
|
- handler plugin exists) will result in an exception. </para>
|
|
|
|
|
|
|
+ <para>Trying to return unknown resource type (i.e., one for which no
|
|
|
|
|
+ handler plugin exists) will result in an exception.</para>
|
|
|
|
|
|
|
|
</sect2>
|
|
</sect2>
|
|
|
|
|
|
|
@@ -510,15 +510,15 @@ class Zend_Amf_Parse_Resource_MysqlResult
|
|
|
<sect2 id="zend.amf.server.flash">
|
|
<sect2 id="zend.amf.server.flash">
|
|
|
<title>Conectándose al Servidor desde Flash</title>
|
|
<title>Conectándose al Servidor desde Flash</title>
|
|
|
|
|
|
|
|
- <para> La conexión a <classname>Zend_Amf_Server</classname> desde su
|
|
|
|
|
|
|
+ <para>La conexión a <classname>Zend_Amf_Server</classname> desde su
|
|
|
proyecto Flash es ligeramente distinta a la de Flex. Sin embargo una
|
|
proyecto Flash es ligeramente distinta a la de Flex. Sin embargo una
|
|
|
vez que la conexión con Flash funcione con
|
|
vez que la conexión con Flash funcione con
|
|
|
<classname>Zend_Amf_Server</classname> lo hará igual modo que
|
|
<classname>Zend_Amf_Server</classname> lo hará igual modo que
|
|
|
con Flex. El siguiente ejemplo también puede ser utilizado desde un
|
|
con Flex. El siguiente ejemplo también puede ser utilizado desde un
|
|
|
fichero Flex <acronym>AS3</acronym>. Para nuestra conexión vamos a
|
|
fichero Flex <acronym>AS3</acronym>. Para nuestra conexión vamos a
|
|
|
reutilizar la misma configuracion
|
|
reutilizar la misma configuracion
|
|
|
- <classname>Zend_Amf_Server</classname> junto a la clase Mundo. </para>
|
|
|
|
|
- <para> Abra Flash CS y cree un nuevo fichero Flash (ActionScript 3).
|
|
|
|
|
|
|
+ <classname>Zend_Amf_Server</classname> junto a la clase Mundo.</para>
|
|
|
|
|
+ <para>Abra Flash CS y cree un nuevo fichero Flash (ActionScript 3).
|
|
|
Nombre al documento como <filename>ZendExample.fla</filename> y
|
|
Nombre al documento como <filename>ZendExample.fla</filename> y
|
|
|
guárdelo en una carpeta que utilizará para este ejemplo. Cree una
|
|
guárdelo en una carpeta que utilizará para este ejemplo. Cree una
|
|
|
nuevo fichero <acronym>AS3</acronym> en el mismo directorio y
|
|
nuevo fichero <acronym>AS3</acronym> en el mismo directorio y
|
|
@@ -530,11 +530,11 @@ class Zend_Amf_Parse_Resource_MysqlResult
|
|
|
en<filename>ZendExample.fla</filename> Cuando ejecute el fichero
|
|
en<filename>ZendExample.fla</filename> Cuando ejecute el fichero
|
|
|
ZendExample de Flash se ejecutará ahora la clase
|
|
ZendExample de Flash se ejecutará ahora la clase
|
|
|
<filename>Main.as</filename> El paso siguiente será añadir
|
|
<filename>Main.as</filename> El paso siguiente será añadir
|
|
|
- ActionScript para hacer una lamada <acronym>AMF</acronym>. </para>
|
|
|
|
|
- <para> Ahora vamos a hacer una clase Main(principal) para que podamos
|
|
|
|
|
|
|
+ ActionScript para hacer una lamada <acronym>AMF</acronym>.</para>
|
|
|
|
|
+ <para>Ahora vamos a hacer una clase Main(principal) para que podamos
|
|
|
enviar los datos al servidor y mostrar el resultado. Copie el código
|
|
enviar los datos al servidor y mostrar el resultado. Copie el código
|
|
|
siguiente en su fichero <filename>Main.as</filename> y luego vamos a
|
|
siguiente en su fichero <filename>Main.as</filename> y luego vamos a
|
|
|
- recorrer el código para describir cuál es el papel de cada elemento. </para>
|
|
|
|
|
|
|
+ recorrer el código para describir cuál es el papel de cada elemento.</para>
|
|
|
<programlisting language="as"><![CDATA[
|
|
<programlisting language="as"><![CDATA[
|
|
|
package {
|
|
package {
|
|
|
import flash.display.MovieClip;
|
|
import flash.display.MovieClip;
|
|
@@ -570,78 +570,78 @@ package {
|
|
|
]]></programlisting>
|
|
]]></programlisting>
|
|
|
|
|
|
|
|
|
|
|
|
|
- <para> Primero tenemos que importar dos bibliotecas de ActionScript que
|
|
|
|
|
|
|
+ <para>Primero tenemos que importar dos bibliotecas de ActionScript que
|
|
|
realizan la mayor parte del trabajo. La primera es NetConnection que
|
|
realizan la mayor parte del trabajo. La primera es NetConnection que
|
|
|
actúa como un tubo bidireccional entre el cliente y el servidor. La
|
|
actúa como un tubo bidireccional entre el cliente y el servidor. La
|
|
|
segunda es un objeto Responder que maneja los valores de retorno
|
|
segunda es un objeto Responder que maneja los valores de retorno
|
|
|
desde el servidor, y que están relacionados con el éxito o el
|
|
desde el servidor, y que están relacionados con el éxito o el
|
|
|
- fracaso de la llamada. </para>
|
|
|
|
|
|
|
+ fracaso de la llamada.</para>
|
|
|
<programlisting language="as"><![CDATA[
|
|
<programlisting language="as"><![CDATA[
|
|
|
import flash.net.NetConnection;
|
|
import flash.net.NetConnection;
|
|
|
import flash.net.Responder;
|
|
import flash.net.Responder;
|
|
|
]]></programlisting>
|
|
]]></programlisting>
|
|
|
- <para> En la clase necesitaremos tres variables para representar a
|
|
|
|
|
|
|
+ <para>En la clase necesitaremos tres variables para representar a
|
|
|
NetConnection, Responder, y la <acronym>URL</acronym> del gateway a
|
|
NetConnection, Responder, y la <acronym>URL</acronym> del gateway a
|
|
|
- nuestra instalación <classname>Zend_Amf_Server</classname>. </para>
|
|
|
|
|
|
|
+ nuestra instalación <classname>Zend_Amf_Server</classname>.</para>
|
|
|
<programlisting language="as"><![CDATA[
|
|
<programlisting language="as"><![CDATA[
|
|
|
private var gateway:String = "http://example.com/server.php";
|
|
private var gateway:String = "http://example.com/server.php";
|
|
|
private var connection:NetConnection;
|
|
private var connection:NetConnection;
|
|
|
private var responder:Responder;
|
|
private var responder:Responder;
|
|
|
]]></programlisting>
|
|
]]></programlisting>
|
|
|
- <para> En el constructor Main creamos un Responder(respondedor) y una
|
|
|
|
|
|
|
+ <para>En el constructor Main creamos un Responder(respondedor) y una
|
|
|
nueva conexión al punto final de
|
|
nueva conexión al punto final de
|
|
|
<classname>Zend_Amf_Server</classname>. El respondedor define
|
|
<classname>Zend_Amf_Server</classname>. El respondedor define
|
|
|
dos diferentes métodos para manejar la respuesta desde el servidor.
|
|
dos diferentes métodos para manejar la respuesta desde el servidor.
|
|
|
- Por simplicidad los hemos llamado onResult y onFault. </para>
|
|
|
|
|
|
|
+ Por simplicidad los hemos llamado onResult y onFault.</para>
|
|
|
<programlisting language="as"><![CDATA[
|
|
<programlisting language="as"><![CDATA[
|
|
|
responder = new Responder(onResult, onFault);
|
|
responder = new Responder(onResult, onFault);
|
|
|
connection = new NetConnection;
|
|
connection = new NetConnection;
|
|
|
connection.connect(gateway);
|
|
connection.connect(gateway);
|
|
|
]]></programlisting>
|
|
]]></programlisting>
|
|
|
- <para> La función onComplete se ejecuta tan pronto como la construcción
|
|
|
|
|
|
|
+ <para>La función onComplete se ejecuta tan pronto como la construcción
|
|
|
ha concluido, enviando los datos al servidor. Necesitamos añadir una
|
|
ha concluido, enviando los datos al servidor. Necesitamos añadir una
|
|
|
línea más que hace una llamada a la función
|
|
línea más que hace una llamada a la función
|
|
|
- <classname>Zend_Amf_Server</classname> Mundo->hola. </para>
|
|
|
|
|
|
|
+ <classname>Zend_Amf_Server</classname> Mundo->hola.</para>
|
|
|
<programlisting language="as"><![CDATA[
|
|
<programlisting language="as"><![CDATA[
|
|
|
connection.call("Mundo.hola", responder, params);
|
|
connection.call("Mundo.hola", responder, params);
|
|
|
]]></programlisting>
|
|
]]></programlisting>
|
|
|
- <para> Cuando creamos la variable responder hemos definido las funciones
|
|
|
|
|
|
|
+ <para>Cuando creamos la variable responder hemos definido las funciones
|
|
|
onResult y onFault para manejar la respuesta proveniente del
|
|
onResult y onFault para manejar la respuesta proveniente del
|
|
|
servidor. Hemos añadido la función OnResult para el resultado
|
|
servidor. Hemos añadido la función OnResult para el resultado
|
|
|
exitoso desde el servidor. Cada vez que se ejecuta apropiadamente el
|
|
exitoso desde el servidor. Cada vez que se ejecuta apropiadamente el
|
|
|
manejo de conexión con el servidor, el manejador de eventos llama
|
|
manejo de conexión con el servidor, el manejador de eventos llama
|
|
|
- esta función. </para>
|
|
|
|
|
|
|
+ esta función.</para>
|
|
|
<programlisting language="as"><![CDATA[
|
|
<programlisting language="as"><![CDATA[
|
|
|
private function onResult(result:Object):void {
|
|
private function onResult(result:Object):void {
|
|
|
// Muestra los datos devueltos
|
|
// Muestra los datos devueltos
|
|
|
trace(String(result));
|
|
trace(String(result));
|
|
|
}
|
|
}
|
|
|
]]></programlisting>
|
|
]]></programlisting>
|
|
|
- <para> La función onFault, se llama si hubo una respuesta nula desde el
|
|
|
|
|
|
|
+ <para>La función onFault, se llama si hubo una respuesta nula desde el
|
|
|
servidor. Esto ocurre cuando hay un error en el servidor, la
|
|
servidor. Esto ocurre cuando hay un error en el servidor, la
|
|
|
<acronym>URL</acronym> al servidor es inválida, el servicio
|
|
<acronym>URL</acronym> al servidor es inválida, el servicio
|
|
|
remoto o método no existe o cualquier otra cuestión relacionada con
|
|
remoto o método no existe o cualquier otra cuestión relacionada con
|
|
|
- la conexión. </para>
|
|
|
|
|
|
|
+ la conexión.</para>
|
|
|
<programlisting language="as"><![CDATA[
|
|
<programlisting language="as"><![CDATA[
|
|
|
private function onFault(fault:Object):void {
|
|
private function onFault(fault:Object):void {
|
|
|
trace(String(fault.description));
|
|
trace(String(fault.description));
|
|
|
}
|
|
}
|
|
|
]]></programlisting>
|
|
]]></programlisting>
|
|
|
- <para> La inclusión de ActionScript para realizar la conexión remota ha
|
|
|
|
|
|
|
+ <para>La inclusión de ActionScript para realizar la conexión remota ha
|
|
|
finalizado. Al ejecutar el fichero ZendExample, se establece una
|
|
finalizado. Al ejecutar el fichero ZendExample, se establece una
|
|
|
conexión con Zend_Amf. En resumen, se han añadido las variables
|
|
conexión con Zend_Amf. En resumen, se han añadido las variables
|
|
|
requeridas para abrir una conexión con el servidor remoto, se han
|
|
requeridas para abrir una conexión con el servidor remoto, se han
|
|
|
definido qué métodos se deben utilizar cuando su aplicación recibe
|
|
definido qué métodos se deben utilizar cuando su aplicación recibe
|
|
|
una respuesta desde el servidor, y finalmente se han mostrado los
|
|
una respuesta desde el servidor, y finalmente se han mostrado los
|
|
|
datos de salida devueltos a través de
|
|
datos de salida devueltos a través de
|
|
|
- <methodname>trace()</methodname>. </para>
|
|
|
|
|
|
|
+ <methodname>trace()</methodname>.</para>
|
|
|
|
|
|
|
|
</sect2>
|
|
</sect2>
|
|
|
|
|
|
|
|
<sect2 id="zend.amf.server.auth">
|
|
<sect2 id="zend.amf.server.auth">
|
|
|
<title>Authentication</title>
|
|
<title>Authentication</title>
|
|
|
|
|
|
|
|
- <para>
|
|
|
|
|
|
|
+ <para>
|
|
|
<classname>Zend_Amf_Server</classname> allows you to specify
|
|
<classname>Zend_Amf_Server</classname> allows you to specify
|
|
|
authentication and authorization hooks to control access to the
|
|
authentication and authorization hooks to control access to the
|
|
|
services. It is using the infrastructure provided by <link
|
|
services. It is using the infrastructure provided by <link
|
|
@@ -649,42 +649,42 @@ private function onFault(fault:Object):void {
|
|
|
<classname>Zend_Auth</classname>
|
|
<classname>Zend_Auth</classname>
|
|
|
</link> and <link linkend="zend.acl">
|
|
</link> and <link linkend="zend.acl">
|
|
|
<classname>Zend_Acl</classname>
|
|
<classname>Zend_Acl</classname>
|
|
|
- </link> components. </para>
|
|
|
|
|
|
|
+ </link> components.</para>
|
|
|
|
|
|
|
|
- <para> In order to define authentication, the user provides
|
|
|
|
|
|
|
+ <para>In order to define authentication, the user provides
|
|
|
authentication adapter extening
|
|
authentication adapter extening
|
|
|
<classname>Zend_Amf_Auth_Abstract</classname> abstract class.
|
|
<classname>Zend_Amf_Auth_Abstract</classname> abstract class.
|
|
|
The adapter should implement the
|
|
The adapter should implement the
|
|
|
<methodname>authenticate()</methodname> method just like regular
|
|
<methodname>authenticate()</methodname> method just like regular
|
|
|
<link linkend="zend.auth.introduction.adapters">authentication
|
|
<link linkend="zend.auth.introduction.adapters">authentication
|
|
|
- adapter</link>. </para>
|
|
|
|
|
|
|
+ adapter</link>.</para>
|
|
|
|
|
|
|
|
- <para> The adapter should use properties <emphasis>_username</emphasis>
|
|
|
|
|
|
|
+ <para>The adapter should use properties <emphasis>_username</emphasis>
|
|
|
and <emphasis>_password</emphasis> from the parent
|
|
and <emphasis>_password</emphasis> from the parent
|
|
|
<classname>Zend_Amf_Auth_Abstract</classname> class in order to
|
|
<classname>Zend_Amf_Auth_Abstract</classname> class in order to
|
|
|
authenticate. These values are set by the server using
|
|
authenticate. These values are set by the server using
|
|
|
<methodname>setCredentials()</methodname> method before call to
|
|
<methodname>setCredentials()</methodname> method before call to
|
|
|
<methodname>authenticate()</methodname> if the credentials are
|
|
<methodname>authenticate()</methodname> if the credentials are
|
|
|
- received in the <acronym>AMF</acronym> request headers. </para>
|
|
|
|
|
|
|
+ received in the <acronym>AMF</acronym> request headers.</para>
|
|
|
|
|
|
|
|
- <para> The identity returned by the adapter should be an object
|
|
|
|
|
|
|
+ <para>The identity returned by the adapter should be an object
|
|
|
containing property <property>role</property> for the
|
|
containing property <property>role</property> for the
|
|
|
- <acronym>ACL</acronym> access control to work. </para>
|
|
|
|
|
|
|
+ <acronym>ACL</acronym> access control to work.</para>
|
|
|
|
|
|
|
|
- <para> If the authentication result is not successful, the request is
|
|
|
|
|
|
|
+ <para>If the authentication result is not successful, the request is
|
|
|
not proceseed further and failure message is returned with the
|
|
not proceseed further and failure message is returned with the
|
|
|
- reasons for failure taken from the result. </para>
|
|
|
|
|
|
|
+ reasons for failure taken from the result.</para>
|
|
|
|
|
|
|
|
- <para> The adapter is connected to the server using
|
|
|
|
|
- <methodname>setAuth()</methodname> method: </para>
|
|
|
|
|
|
|
+ <para>The adapter is connected to the server using
|
|
|
|
|
+ <methodname>setAuth()</methodname> method:</para>
|
|
|
|
|
|
|
|
<programlisting language="php"><![CDATA[
|
|
<programlisting language="php"><![CDATA[
|
|
|
$server->setAuth(new My_Amf_Auth());
|
|
$server->setAuth(new My_Amf_Auth());
|
|
|
]]></programlisting>
|
|
]]></programlisting>
|
|
|
|
|
|
|
|
- <para> Access control is performed by using
|
|
|
|
|
|
|
+ <para>Access control is performed by using
|
|
|
<classname>Zend_Acl</classname> object set by
|
|
<classname>Zend_Acl</classname> object set by
|
|
|
- <methodname>setAcl()</methodname> method: </para>
|
|
|
|
|
|
|
+ <methodname>setAcl()</methodname> method:</para>
|
|
|
|
|
|
|
|
<programlisting language="php"><![CDATA[
|
|
<programlisting language="php"><![CDATA[
|
|
|
$acl = new Zend_Acl();
|
|
$acl = new Zend_Acl();
|
|
@@ -692,21 +692,21 @@ createPermissions($acl); // create permission structure
|
|
|
$server->setAcl($acl);
|
|
$server->setAcl($acl);
|
|
|
]]></programlisting>
|
|
]]></programlisting>
|
|
|
|
|
|
|
|
- <para> If the <acronym>ACL</acronym> object is set, and the class being
|
|
|
|
|
|
|
+ <para>If the <acronym>ACL</acronym> object is set, and the class being
|
|
|
called defines <methodname>initAcl()</methodname> method, this
|
|
called defines <methodname>initAcl()</methodname> method, this
|
|
|
method will be called with the <acronym>ACL</acronym> object as an
|
|
method will be called with the <acronym>ACL</acronym> object as an
|
|
|
argument. The class then can create additional
|
|
argument. The class then can create additional
|
|
|
<acronym>ACL</acronym> rules and return
|
|
<acronym>ACL</acronym> rules and return
|
|
|
<constant>TRUE</constant>, or return <constant>FALSE</constant>
|
|
<constant>TRUE</constant>, or return <constant>FALSE</constant>
|
|
|
- if no access control is required for this class. </para>
|
|
|
|
|
|
|
+ if no access control is required for this class.</para>
|
|
|
|
|
|
|
|
- <para> After <acronym>ACL</acronym> have been set up, the server will
|
|
|
|
|
|
|
+ <para>After <acronym>ACL</acronym> have been set up, the server will
|
|
|
check if access is allowed with role set by the authentication,
|
|
check if access is allowed with role set by the authentication,
|
|
|
resource being the class name (or <constant>NULL</constant> for
|
|
resource being the class name (or <constant>NULL</constant> for
|
|
|
function calls) and privilege being the function name. If no
|
|
function calls) and privilege being the function name. If no
|
|
|
authentication was provided, then if the
|
|
authentication was provided, then if the
|
|
|
<emphasis>anonymous</emphasis> role was defined, it will be
|
|
<emphasis>anonymous</emphasis> role was defined, it will be
|
|
|
- used, otherwise the access will be denied. </para>
|
|
|
|
|
|
|
+ used, otherwise the access will be denied.</para>
|
|
|
|
|
|
|
|
<programlisting language="php"><![CDATA[
|
|
<programlisting language="php"><![CDATA[
|
|
|
if($this->_acl->isAllowed($role, $class, $function)) {
|
|
if($this->_acl->isAllowed($role, $class, $function)) {
|