Classe genérica para conexão (PHP + AMFPHP + Flex)

Opa! buenas a todos!

Então! ai vai mais uma classe que me ajudou bastante! ;)

Uma classe de conexão genérica, onde eu não preciso criar a tag do objeto <mx:RemoteObject /> em todos os componentes que utilizam conexão. E fora que utilizando a tag do RemoteObjet, eu fico limitado a utilizar apenas uma classe do AMFPHP.

Vamos a classe:

/*
* Autor: Gregui Shigunov
* Data: 18/05/2007
* Observação: Classe para conexão Flex
*/

package gregui
{
import mx.core.Application;
import mx.rpc.events.FaultEvent;
import mx.controls.Alert;
import mx.core.IFlexDisplayObject;
import mx.managers.PopUpManager;
import flash.display.DisplayObject;
import mx.rpc.remoting.mxml.RemoteObject;
import mx.rpc.remoting.mxml.Operation;

public class Conexao


{

/**
* Trata quando o Remote Object levanta um erro
*
* @param fault
*/

public static function connectError(fault:FaultEvent):void {
Alert.show( fault.fault.faultString +” \n”
+ fault.fault.message + ” \n”
+ fault.fault.faultDetail + ” \n”
+ fault.fault.toString() + ” \n”
, fault.fault.faultCode.toString());
}

/**
* Conecta com classe do AMFPHP
* limitado até 5 parametros
*
* @param classe nome da classe a ser chamado
* @param metodo da classe
* @func_retorno função que irá tratar o retorno do método
* @rest… parâmetros que irão ser passados para o método
*/

public static function abrir(
classe:String, metodo:String, func_retorno:Function, …rest):void {

var ro:RemoteObject = new RemoteObject();
ro.destination = “dest_service“;
ro.source = classe;
ro.showBusyCursor = true;

ro.addEventListener(”fault”, Conexao.connectError);

var op:Operation = ro.getOperation(metodo) as Operation;

op.addEventListener(”result”, func_retorno);

switch (rest.length)
{
case 0:
op.send();
break;
case 1:
op.send(rest[0]);
break;
case 2:
op.send(rest[0], rest[1]);
break;
case 3:
op.send(rest[0], rest[1], rest[2]);
break;
case 4:
op.send(rest[0], rest[1], rest[2], rest[3]);
break;
case 5:
op.send(rest[0], rest[1], rest[2], rest[3], rest[4]);
break;
default:
op.send(rest);
break;
}
}

}
}

Observe a string em vermelho (ro.destination = “dest_service“;), dest_service é a configuração do serviço de destino.

Crie 2 arquivos na raiz do projeto chamados “services-config.xml” e “remoting-config.xml” respectivamente.

services-config.xml :

<?xml version=”1.0″ encoding=”utf-8″ ?>
<service id=”amfphp-flashremoting-service” class=”flex.messaging.services.RemotingService” messageTypes=”flex.messaging.messages.RemotingMessage”>

<default-channels>
<channel ref=”my-amfphp”/>
</default-channels>

<destination id=”dest_service“>
<properties>
<source>*</source>
</properties>
</destination>
</service>

remoting-config.xml :

<?xml version=”1.0″ encoding=”UTF-8″?>
<services-config>
<services>
<service-include file-path=”remoting-config.xml” />
</services>

<channels>
<channel-definition id=”my-amfphp” class=”mx.messaging.channels.AMFChannel”>
<endpoint uri=”http://blablabla/amfphp/gateway.php” class=”flex.messaging.endpoints.AMFEndpoint”/>
</channel-definition>
</channels>
</services-config>

A escrita em vermelho é a url de conexão do gateway do AMFPHP.

O próximo passo é colocar a referência dos arquivos de configuração no projeto. Para isso, entre no “properties” do projeto:

E no Item “Flex compiler” coloque referência ao arquivo de configuração:

Additional compiler arguments: -locale pt_BR -services services-config.xml

Pronto!!!!

Como usar?

<?xml version=”1.0″ encoding=”utf-8″?>
<mx:TitleWindow
xmlns:mx=”http://www.adobe.com/2006/mxml”
layout=”absolute” width=”300″ height=”600″ title=”Exemplo”
showCloseButton=”true”
close=”this.parent.removeChild(this)”
creationComplete=”init();”>

<mx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.rpc.events.ResultEvent;
import gregui.Conexao;

private function init():void {
this.isPopUp = true;

Conexao.abrir("Acesso", "logar", this.onRecebeDados,
"usuario","senha");

}

private function onRecebeDados(re:ResultEvent):void {
if (re.result.logado == "true") {
Alert.show("Logado");
}

if (re.result.logado == "false") {
Alert.show(re.result.erro);
}

}

]]>
</mx:Script>
</mx:TitleWindow>

para ficar mais claro, ai vai uma classe (PHP) para conexão:

Acesso.php

<?php
/*
* Autor: Gregui Shigunov
* Data: 26/05/2007
* Observação: Classe para interface de “login”
*
*/

include_once(”gregui/config.php”);
include_once(”gregui/bo/LoginBO.php”);

class Acesso {

/**
* Loga o usuário no sistema
*
* retorna array com:
*
* logado: String
* erro: Mensagem de erro se houver
*
* @param String $strUsuario
* @param String $strSenha
* @return Array
*/

public function logar($strUsuario, $strSenha) {
$arrayRetorno = array();

$bo = new LoginBO();

$logado = $bo->logar($strUsuario, $strSenha);

if ($logado) {
$arrayRetorno["logado"] = “true”;
} else {
$arrayRetorno["logado"] = “false”;
$arrayRetorno["erro"] = “Usuário inválido ou senha incorreta!”;
}

return $arrayRetorno;
}

Lembrando que esse arquivo deve ficar na pasta “services” do AMFPHP.

Bom! é isso! Espero ter ajudado!

4 Respostas para “Classe genérica para conexão (PHP + AMFPHP + Flex)”

  1. Linox Disse:

    Ola Gregui, eu estava seguindo seu posto passo a passo até a a hora de criar a classe de conexao, nela vc faz um include: ”gregui/config.php” e ”gregui/bo/LoginBO.php”, vc tem como disponibilizar esses codigos?
    grande abraço e parabens pelos post, são muito bons.

  2. Adriano Disse:

    E ae Gregui… muito legal seu trabalho.
    Estou tentando utlizá-los, mas sem sucesso. Tem como disponibilizar os arquivos? ou a estrutura deles? valeu…

  3. Ricardo Disse:

    Dica no lugar do:

    switch (rest.length)
    {
    case 0:
    op.send();
    break;
    case 1:
    op.send(rest[0]);
    break;
    case 2:
    op.send(rest[0], rest[1]);
    break;
    case 3:
    op.send(rest[0], rest[1], rest[2]);
    break;
    case 4:
    op.send(rest[0], rest[1], rest[2], rest[3]);
    break;
    case 5:
    op.send(rest[0], rest[1], rest[2], rest[3], rest[4]);
    break;
    default:
    op.send(rest);
    break;
    }
    }

    vc pode trocar por um apply:

    op.send.apply(this, rest);

    aii pode passar qtos paremetros quiser

    ;-)

  4. Gregui Shigunov Disse:

    Boa!!! Dica anotada!
    Valeu!

Deixe um comentário