SlideShare uma empresa Scribd logo
Integração do Flex com
PHP através do AMFPHP

         Eduardo Kraus
     FloripaFlex 20/05/2009
Quem sou eu?
•   Iniciei minha vida digital aos 15 anos com
    meu primeiro PC, um 486DX100;
•   Iniciei na programação através do C++ com
    Dev-C++;
•   Em 2005 conheci o PHP e larguei tudo e fui
    atrás dele;
•   Em 2007 conheci o Flex e foi paixão a
    primeira vista.
Porque o Flex é tão bom?

•   Você programa para usuário, não para
    browser;
•   Velocidade no desenvolvimento;
•   Beleza da aplicação;
•   Segurança na aplicação.
Integração via XML

•   Maior tráfego de dados;
•   Difícil manipulação no Flex;
•   http://www.google.com/search?q=flex+xml
public function XmlExample() {
  var employees:XML =
    <employees>
      <employee ssn="123-123-1234">
        <name first="John" last="Doe"/>
        <address>
          <street>11 Main St.</street>
          <city>San Francisco</city>
          <state>CA</state>
          <zip>98765</zip>
        </address>
      </employee>
    </employees>;
  trace(employees.employee[0].address.zip);
  trace(employees.employee[1].@ssn);
  trace(employees.employee.name);
  trace(employees..zip[0]);
  trace(employees..@ssn[1]);
  trace(employees..name);
}

 Fonte: http://livedocs.adobe.com/flex/3/langref/XML.html
Integração via HTTPService

•   Tráfego mais rápido que o XML;
•   Ainda continua difícil a interpretação no
    Flex;
•   http://www.google.com/search?q=flex+amf
private var gateway : RemotingConnection;
     private function doLogin(): void{
       gateway = new
     RemotingConnection("amfphp/gateway.php");
       gateway.call("classes.doLogin", new
     Responder(onResult,
     onFault),inUsuario.text,inSenha.text);
     }
     private function onResult( result:Array) : void{
       Usuario.getInstance().id = parseInt(result[0]
     ["id"]);
       Usuario.getInstance().nome = result[0]
     ["nome"].toString();
       Usuario.getInstance().usuario = result[0]
     ["usuario"].toString();
       Usuario.getInstance().permissao =
     parseInt(result[0]["permissao"]);
 }



Fonte: Projeto antigo
Integração via RemoteObject

•   Mesma velocidade de tráfego que o
    HTTPService com AMFPHP;
•   Muito fácil de manipular os dados;
•   Muito fácil implementar os chamados para
    o AMFPHP.
Porque o AMFPHP

•   Muito fácil de utilizar;
•   Código aberto;
•   Comunidade ampla, facilitando a ajuda;
•   Tempo de instalação praticamente zero.
Vamos ao que interessa
O AMFPHP

Baixe-o em http://www.amfphp.org/
  descompacte-o na pasta “src” e
  após isso aconselho a fazer
  algumas modificações.
Apagar os arquivos e pastas
  desnecessários e principalmente
  renomear o gateway.php para
  index.php
O Arquivo services-config.xml

O arquivo services-config.xml é responsável pela
  configuração do RemoteObject no Flex Builder.
Este arquivo deve ser passado como argumento na
  compilação. Para isso você vai a Proprietes >>
  Flex Compiler e em additional compiler
  arguments: e adicione o seguinte

-locale en_US -services "services-config.xml"
Integração do Flex com PHP através do AMFPHP
O Arquivo services-config.xml
<?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="CanalAmfphp">
        <channels>
          <channel ref="my-amfphp"/>
        </channels>
                                                        Destino da conexão
        <properties>
          <source>*</source>
        </properties>
                                                         URL para conexão
      </destination>
    </service>                                            com o AMFPHP
  </services>
  <channels>
    <channel-definition id="my-amfphp"
               class="mx.messaging.channels.AMFChannel">
      <endpoint uri="amfphp/"
             class="flex.messaging.endpoints.AMFEndpoint"/>
    </channel-definition>
  </channels>
</services-config>
Realizando uma conexão
private function listar():void
{
   var remote:RemoteObject = new RemoteObject("CanalAmfphp");
    remote.showBusyCursor = true;
    remote.source = "vo.UsuarioService";
    remote.addEventListener(ResultEvent.RESULT, resultListar)
    remote.addEventListener(FaultEvent.FAULT, ErroListar)
    remote.getOperation("Listar").send();
}
private function ErroListar(e:FaultEvent):void
{
    Alert.show(e.fault.faultString,
               e.fault.faultCode.toString());
}
private function resultListar(e:ResultEvent):void
{
    dgUsuarios.dataProvider = e.result as Array;
}
Apresentando os dados
<mx:Button x="10" y="10" label="Listar usuários" click="listar()"/>
   <mx:DataGrid x="10" y="40" width="400" id="dgUsuarios"
       itemClick="selecionaUsuario()" height="144">
       <mx:columns>
           <mx:DataGridColumn headerText="Nome completo" dataField="Nome"/>
           <mx:DataGridColumn headerText="E-mail" dataField="Email"/>
           <mx:DataGridColumn headerText="Endereço" dataField="Endereco"/>
       </mx:columns>
   </mx:DataGrid>
   <mx:Label x="10" y="208" text="ID:" width="110" textAlign="right"
  fontWeight="bold"/>
   <mx:Label x="10" y="234" text="Nome completo:" width="110"
  textAlign="right" fontWeight="bold"/>
   <mx:Label x="10" y="260" text="E-mail:" width="110" textAlign="right"
  fontWeight="bold"/>
   <mx:Label x="10" y="286" text="Endereço:" width="110" textAlign="right"
  fontWeight="bold"/>
   <mx:Label x="128" y="208" text="{selectedPerson.ID}"/>
   <mx:Label x="128" y="234" text="{selectedPerson.Nome}"/>
   <mx:Label x="128" y="260" text="{selectedPerson.Email}"/>
   <mx:Label x="126" y="286" text="{selectedPerson.Endereco}"/>
As classes Usuario
A classe vo/Usuario.php
class Usuario {
  var $_explicitType = "vo.Usuario";

    var   $ID;
    var   $Nome;
    var   $Email;
    var   $Endereco;
}

A classe vo/Usuario.as
package vo
{
  [RemoteClass(alias="vo.Usuario")]
  [Bindable]
  public class Usuario
  {
    public var ID:String;
    public var Nome:String;
    public var Email:String;
    public var Endereco:String;
  }
}
As classes Usuario
A classe vo/Usuario.php
class Usuario {
  var $_explicitType = "qualquerCoisaAqui";

    var   $ID;
    var   $Nome;
    var   $Email;
    var   $Endereco;
}

A classe vo/Usuario.as
package vo
{
  [RemoteClass(alias="qualquerCoisaAqui")]
  [Bindable]
  public class Usuario
  {
    public var ID:String;
    public var Nome:String;
    public var Email:String;
    public var Endereco:String;
  }
}
A classe UsuarioService
require("Usuario.php");
class UsuarioService
{
  function Listar()
  {
    $retorno = '';

         $retorno[] = new Usuario(1,   "Eduardo Kraus", "contato@mxml.com.br",
        "Palhoça SC");
         $retorno[] = new Usuario(2,   "Usuarios 2",   "usuario@mxml.com.br",
        "Florianópolis SC");
         $retorno[] = new Usuario(3,   "Estagiario",   "estagiario@mxml.com.br", "São
        José SC");
         return $retorno;
    }
}
A aplicação
A aplicação
A aplicação
[Bindable] private var selectedPerson:Usuario;
    private function listar():void{
      var remote:RemoteObject = new RemoteObject("CanalAmfphp");
      remote.showBusyCursor = true;
      remote.source = "vo.UsuarioService";
      remote.addEventListener(ResultEvent.RESULT, resultListar)
      remote.addEventListener(FaultEvent.FAULT,    ErroListar)
      remote.getOperation("Listar").send();
    }
    private function ErroListar(e:FaultEvent):void{
      Alert.show(e.fault.faultString, e.fault.faultCode.toString());
    }
    private function resultListar(e:ResultEvent):void{
      dgUsuarios.dataProvider = e.result as Array;
    }
    private function selecionaUsuario():void{
      selectedPerson = Usuario(dgUsuarios.selectedItem);
    }
<mx:Button x="10" y="10" label="Listar usuários" click="listar()"/>
<mx:DataGrid x="10" y="40" width="400" id="dgUsuarios"
  itemClick="selecionaUsuario()" height="144">
  <mx:columns>
    <mx:DataGridColumn headerText="Nome completo" dataField="Nome"/>
    <mx:DataGridColumn headerText="E-mail"     dataField="Email"/>
    <mx:DataGridColumn headerText="Endereço"     dataField="Endereco"/>
  </mx:columns>
</mx:DataGrid>
<mx:Label x="128" y="208" text="{selectedPerson.ID}"/>
<mx:Label x="128" y="234" text="{selectedPerson.Nome}"/>
<mx:Label x="128" y="260" text="{selectedPerson.Email}"/>
<mx:Label x="126" y="286" text="{selectedPerson.Endereco}"/>
Podemos melhorar a conexão
Criar uma classe global que fará a conexão e em caso de
  erro apresente em um Alert e em sucesso retorne para a
  nossa função:
public class RemoteObjectAMFPHP extends RemoteObject{
  public function RemoteObjectAMFPHP():void{
    super("CanalAmfphp")
  }
  public function Remoto(_source:String, result:Function):void{
    this.source = _source;
    this.showBusyCursor = true;
    this.addEventListener(ResultEvent.RESULT, result);
    this.addEventListener(FaultEvent.FAULT, Falha);
  }
  private function Falha(e:FaultEvent):void{
    Alert.show(e.fault.faultString, e.fault.faultCode.toString());
  }
}
Podemos melhorar a conexão

Deste modo a chamada fica mais
 simples:
private function listar():void{
  var remote:RemoteObjectAMFPHP = new RemoteObjectAMFPHP()
  remote.Remoto("vo.UsuarioService", resultListar);
  remote.getOperation("Listar").send();
}
private function resultListar(e:ResultEvent):void{
  dgUsuarios.dataProvider = e.result as Array;
}
Falando de segurança

 Nunca estamos seguros o suficiente
Métodos abertos
•   Cuidado com métodos que somente serão
    acessados por usuário logado;
•   Cuidado com classes que manipulam banco
    de dados, nunca as deixe dentro da pasta
    “services”;
•   Cuidado com métodos que apagam arquivos;
•   Nunca envie as senhas, mesmo
    criptografadas, nos métodos que os listam.
•   Antes de publicar não esquerça de apagar as
    pastas amfphp/browser e
    amfphp/services/amfphp
Sempre o Upload

Quem que não tem um arquivo upload.php
 com o seguinte conteudo?
<?php
  $strOrigem = $_FILES['Filedata'] ['tmp_name'];
  $strDestino = "../upload/".$_FILES['Filedata']['name'];
  if(!move_uploaded_file ($strOrigem, $strDestino)){
    $erroUp->erro("Erro ao mover");
  }
  else{
    $erroUp->erro("Movido com sucesso");
  }
?>
Perguntas

   ?
Para onde ir agora
•   http://blog.mxml.com.br/
•   http://www.amfphp.org/
•   http://www.adobe.com/devnet/flex/
•   http://www.adobe.com/devnet/flex/tourdeflex/
•   http://www.adobe.com/devnet/flex/flex_php.html
•   http://flex.org/
•   http://livedocs.adobe.com/flex/3/langref/
•   http://livedocs.adobe.com/flex/3/html/
•   http://opensource.adobe.com
Obrigado
eduardokraus@gmail.com
 contato@mxml.com.br

Mais conteúdo relacionado

PPT
2009 05 20 Floripa Flex
PPTX
Android webservice
PDF
Criando e consumindo Web Services (REST) com o CakePHP
PPT
PHP FrameWARks - FISL
PDF
Palestra thiago cavalcante
PDF
Play Framework - FLISOL
PDF
PHP RESTful Web Services
PPT
Php FrameWARks - sem CakePHP
2009 05 20 Floripa Flex
Android webservice
Criando e consumindo Web Services (REST) com o CakePHP
PHP FrameWARks - FISL
Palestra thiago cavalcante
Play Framework - FLISOL
PHP RESTful Web Services
Php FrameWARks - sem CakePHP

Mais procurados (17)

PDF
Novas APIs do Java EE 7: JMS e Web Services
PDF
Implementação em ActionScript 3 do Protocolo IRC
PDF
Exemplo caso de uso(Mulesoft)
PDF
Java 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto Alegre
PDF
Usando seu codigo java no mule part 2
PDF
PHP Aula 05 - E-mails, Cookies e Sessoes
PDF
Web 2.0 e AJAX - Parte 2 / 3
ODP
Prog web 05-php-mysql
KEY
PHP RESTful Web Services - PHPConf'09
PDF
Minicurso de PHP Com Ajax
ODP
A Biblioteca cURL
PDF
Proxy, Man-In-The-Middle e testes
PDF
Como criar um plugin para WordPress
ODP
Integração Postfix Active Directory
PDF
LabMM4 (T16 - 12/13) - PHP + MySQL
PPT
Apresentacao TCC - Rafael Felix
PDF
Zabbix monitorando o zimbra collaboration 8.8 (1)
Novas APIs do Java EE 7: JMS e Web Services
Implementação em ActionScript 3 do Protocolo IRC
Exemplo caso de uso(Mulesoft)
Java 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto Alegre
Usando seu codigo java no mule part 2
PHP Aula 05 - E-mails, Cookies e Sessoes
Web 2.0 e AJAX - Parte 2 / 3
Prog web 05-php-mysql
PHP RESTful Web Services - PHPConf'09
Minicurso de PHP Com Ajax
A Biblioteca cURL
Proxy, Man-In-The-Middle e testes
Como criar um plugin para WordPress
Integração Postfix Active Directory
LabMM4 (T16 - 12/13) - PHP + MySQL
Apresentacao TCC - Rafael Felix
Zabbix monitorando o zimbra collaboration 8.8 (1)
Anúncio

Destaque (8)

PDF
Informatics%20 Broschuere Sap[1]
PDF
Informatics%20 Broschuere Rta[1]
PPT
RSS 2012 Literature Searches
PDF
Plano Inova Empresa - Edital Nanotecnologia
PPTX
Traumatic Brain Injury
PDF
Informatics%20 Broschuere Ish[1]
PDF
SHS ASQ 2010 Conference Presentation: Hospital System Patient Flow
PPT
2013session1 3
Informatics%20 Broschuere Sap[1]
Informatics%20 Broschuere Rta[1]
RSS 2012 Literature Searches
Plano Inova Empresa - Edital Nanotecnologia
Traumatic Brain Injury
Informatics%20 Broschuere Ish[1]
SHS ASQ 2010 Conference Presentation: Hospital System Patient Flow
2013session1 3
Anúncio

Semelhante a Integração do Flex com PHP através do AMFPHP (20)

PDF
Evento Front End SP - Organizando o Javascript
KEY
Python 08
PPT
VRaptor - Alta produtividade no Desenvolvimento Web em Java
PPTX
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
PDF
Introdução ao Zend Framework 2
PDF
Vraptor
PPTX
HTTP, JSON, REST e AJAX com AngularJS
PDF
Java e Cloud Computing
PDF
Angular js
PDF
JavaScript e JQuery para Webdesigners
PDF
Entre na fila. Processamento distribuído usando Gearman
PDF
Lidando com desafios dos microserviços com a stack Spring Cloud Netflix
PDF
Realtime com node.js e socket.io
PPTX
Interagindo com web services RPC, SOAP e REST utilizando PHP
ODP
Oficina postgresql avançado_consegi2010
ODP
PDF
Artigoajax
PDF
Consumindo dados via web service no android
PPT
PHP GERAL
PDF
Ajax em java
Evento Front End SP - Organizando o Javascript
Python 08
VRaptor - Alta produtividade no Desenvolvimento Web em Java
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Introdução ao Zend Framework 2
Vraptor
HTTP, JSON, REST e AJAX com AngularJS
Java e Cloud Computing
Angular js
JavaScript e JQuery para Webdesigners
Entre na fila. Processamento distribuído usando Gearman
Lidando com desafios dos microserviços com a stack Spring Cloud Netflix
Realtime com node.js e socket.io
Interagindo com web services RPC, SOAP e REST utilizando PHP
Oficina postgresql avançado_consegi2010
Artigoajax
Consumindo dados via web service no android
PHP GERAL
Ajax em java

Mais de elliando dias (20)

PDF
Clojurescript slides
PDF
Why you should be excited about ClojureScript
PDF
Functional Programming with Immutable Data Structures
PPT
Nomenclatura e peças de container
PDF
Geometria Projetiva
PDF
Polyglot and Poly-paradigm Programming for Better Agility
PDF
Javascript Libraries
PDF
How to Make an Eight Bit Computer and Save the World!
PDF
Ragel talk
PDF
A Practical Guide to Connecting Hardware to the Web
PDF
Introdução ao Arduino
PDF
Minicurso arduino
PDF
Incanter Data Sorcery
PDF
PDF
Fab.in.a.box - Fab Academy: Machine Design
PDF
The Digital Revolution: Machines that makes
PDF
Hadoop + Clojure
PDF
Hadoop - Simple. Scalable.
PDF
Hadoop and Hive Development at Facebook
PDF
Multi-core Parallelization in Clojure - a Case Study
Clojurescript slides
Why you should be excited about ClojureScript
Functional Programming with Immutable Data Structures
Nomenclatura e peças de container
Geometria Projetiva
Polyglot and Poly-paradigm Programming for Better Agility
Javascript Libraries
How to Make an Eight Bit Computer and Save the World!
Ragel talk
A Practical Guide to Connecting Hardware to the Web
Introdução ao Arduino
Minicurso arduino
Incanter Data Sorcery
Fab.in.a.box - Fab Academy: Machine Design
The Digital Revolution: Machines that makes
Hadoop + Clojure
Hadoop - Simple. Scalable.
Hadoop and Hive Development at Facebook
Multi-core Parallelization in Clojure - a Case Study

Último (20)

PPTX
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
PDF
Processos na gestão de transportes, TM100 Col18
PPTX
Curso de Java 11 - (Serializable (Serialização de Objetos)).pptx
PPTX
Curso de Java 14 - (Explicações Adicionais (Classes Abstrata e Interface)).pptx
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
PPTX
Curso de Java 10 - (IO Manipulação de Arquivos).pptx
PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PPTX
Aula sobre desenvolvimento de aplicativos
PDF
COBITxITIL-Entenda as diferença em uso governança TI
PDF
Apple Pippin Uma breve introdução. - David Glotz
PDF
Custos e liquidação no SAP Transportation Management, TM130 Col18
PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PPTX
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
PDF
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
PPTX
Curso de Java 16 - (JEE (Utilizando o Padrão MVC)).pptx
PPTX
Aula sobre banco de dados com firebase db
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
Processos na gestão de transportes, TM100 Col18
Curso de Java 11 - (Serializable (Serialização de Objetos)).pptx
Curso de Java 14 - (Explicações Adicionais (Classes Abstrata e Interface)).pptx
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
Curso de Java 10 - (IO Manipulação de Arquivos).pptx
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
Aula sobre desenvolvimento de aplicativos
COBITxITIL-Entenda as diferença em uso governança TI
Apple Pippin Uma breve introdução. - David Glotz
Custos e liquidação no SAP Transportation Management, TM130 Col18
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
Curso de Java 16 - (JEE (Utilizando o Padrão MVC)).pptx
Aula sobre banco de dados com firebase db

Integração do Flex com PHP através do AMFPHP

  • 1. Integração do Flex com PHP através do AMFPHP Eduardo Kraus FloripaFlex 20/05/2009
  • 2. Quem sou eu? • Iniciei minha vida digital aos 15 anos com meu primeiro PC, um 486DX100; • Iniciei na programação através do C++ com Dev-C++; • Em 2005 conheci o PHP e larguei tudo e fui atrás dele; • Em 2007 conheci o Flex e foi paixão a primeira vista.
  • 3. Porque o Flex é tão bom? • Você programa para usuário, não para browser; • Velocidade no desenvolvimento; • Beleza da aplicação; • Segurança na aplicação.
  • 4. Integração via XML • Maior tráfego de dados; • Difícil manipulação no Flex; • http://www.google.com/search?q=flex+xml
  • 5. public function XmlExample() { var employees:XML = <employees> <employee ssn="123-123-1234"> <name first="John" last="Doe"/> <address> <street>11 Main St.</street> <city>San Francisco</city> <state>CA</state> <zip>98765</zip> </address> </employee> </employees>; trace(employees.employee[0].address.zip); trace(employees.employee[1].@ssn); trace(employees.employee.name); trace(employees..zip[0]); trace(employees..@ssn[1]); trace(employees..name); } Fonte: http://livedocs.adobe.com/flex/3/langref/XML.html
  • 6. Integração via HTTPService • Tráfego mais rápido que o XML; • Ainda continua difícil a interpretação no Flex; • http://www.google.com/search?q=flex+amf
  • 7. private var gateway : RemotingConnection; private function doLogin(): void{ gateway = new RemotingConnection("amfphp/gateway.php"); gateway.call("classes.doLogin", new Responder(onResult, onFault),inUsuario.text,inSenha.text); } private function onResult( result:Array) : void{ Usuario.getInstance().id = parseInt(result[0] ["id"]); Usuario.getInstance().nome = result[0] ["nome"].toString(); Usuario.getInstance().usuario = result[0] ["usuario"].toString(); Usuario.getInstance().permissao = parseInt(result[0]["permissao"]); } Fonte: Projeto antigo
  • 8. Integração via RemoteObject • Mesma velocidade de tráfego que o HTTPService com AMFPHP; • Muito fácil de manipular os dados; • Muito fácil implementar os chamados para o AMFPHP.
  • 9. Porque o AMFPHP • Muito fácil de utilizar; • Código aberto; • Comunidade ampla, facilitando a ajuda; • Tempo de instalação praticamente zero.
  • 10. Vamos ao que interessa
  • 11. O AMFPHP Baixe-o em http://www.amfphp.org/ descompacte-o na pasta “src” e após isso aconselho a fazer algumas modificações. Apagar os arquivos e pastas desnecessários e principalmente renomear o gateway.php para index.php
  • 12. O Arquivo services-config.xml O arquivo services-config.xml é responsável pela configuração do RemoteObject no Flex Builder. Este arquivo deve ser passado como argumento na compilação. Para isso você vai a Proprietes >> Flex Compiler e em additional compiler arguments: e adicione o seguinte -locale en_US -services "services-config.xml"
  • 14. O Arquivo services-config.xml <?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="CanalAmfphp"> <channels> <channel ref="my-amfphp"/> </channels> Destino da conexão <properties> <source>*</source> </properties> URL para conexão </destination> </service> com o AMFPHP </services> <channels> <channel-definition id="my-amfphp" class="mx.messaging.channels.AMFChannel"> <endpoint uri="amfphp/" class="flex.messaging.endpoints.AMFEndpoint"/> </channel-definition> </channels> </services-config>
  • 15. Realizando uma conexão private function listar():void { var remote:RemoteObject = new RemoteObject("CanalAmfphp"); remote.showBusyCursor = true; remote.source = "vo.UsuarioService"; remote.addEventListener(ResultEvent.RESULT, resultListar) remote.addEventListener(FaultEvent.FAULT, ErroListar) remote.getOperation("Listar").send(); } private function ErroListar(e:FaultEvent):void { Alert.show(e.fault.faultString, e.fault.faultCode.toString()); } private function resultListar(e:ResultEvent):void { dgUsuarios.dataProvider = e.result as Array; }
  • 16. Apresentando os dados <mx:Button x="10" y="10" label="Listar usuários" click="listar()"/> <mx:DataGrid x="10" y="40" width="400" id="dgUsuarios" itemClick="selecionaUsuario()" height="144"> <mx:columns> <mx:DataGridColumn headerText="Nome completo" dataField="Nome"/> <mx:DataGridColumn headerText="E-mail" dataField="Email"/> <mx:DataGridColumn headerText="Endereço" dataField="Endereco"/> </mx:columns> </mx:DataGrid> <mx:Label x="10" y="208" text="ID:" width="110" textAlign="right" fontWeight="bold"/> <mx:Label x="10" y="234" text="Nome completo:" width="110" textAlign="right" fontWeight="bold"/> <mx:Label x="10" y="260" text="E-mail:" width="110" textAlign="right" fontWeight="bold"/> <mx:Label x="10" y="286" text="Endereço:" width="110" textAlign="right" fontWeight="bold"/> <mx:Label x="128" y="208" text="{selectedPerson.ID}"/> <mx:Label x="128" y="234" text="{selectedPerson.Nome}"/> <mx:Label x="128" y="260" text="{selectedPerson.Email}"/> <mx:Label x="126" y="286" text="{selectedPerson.Endereco}"/>
  • 17. As classes Usuario A classe vo/Usuario.php class Usuario { var $_explicitType = "vo.Usuario"; var $ID; var $Nome; var $Email; var $Endereco; } A classe vo/Usuario.as package vo { [RemoteClass(alias="vo.Usuario")] [Bindable] public class Usuario { public var ID:String; public var Nome:String; public var Email:String; public var Endereco:String; } }
  • 18. As classes Usuario A classe vo/Usuario.php class Usuario { var $_explicitType = "qualquerCoisaAqui"; var $ID; var $Nome; var $Email; var $Endereco; } A classe vo/Usuario.as package vo { [RemoteClass(alias="qualquerCoisaAqui")] [Bindable] public class Usuario { public var ID:String; public var Nome:String; public var Email:String; public var Endereco:String; } }
  • 19. A classe UsuarioService require("Usuario.php"); class UsuarioService { function Listar() { $retorno = ''; $retorno[] = new Usuario(1, "Eduardo Kraus", "contato@mxml.com.br", "Palhoça SC"); $retorno[] = new Usuario(2, "Usuarios 2", "usuario@mxml.com.br", "Florianópolis SC"); $retorno[] = new Usuario(3, "Estagiario", "estagiario@mxml.com.br", "São José SC"); return $retorno; } }
  • 23. [Bindable] private var selectedPerson:Usuario; private function listar():void{ var remote:RemoteObject = new RemoteObject("CanalAmfphp"); remote.showBusyCursor = true; remote.source = "vo.UsuarioService"; remote.addEventListener(ResultEvent.RESULT, resultListar) remote.addEventListener(FaultEvent.FAULT, ErroListar) remote.getOperation("Listar").send(); } private function ErroListar(e:FaultEvent):void{ Alert.show(e.fault.faultString, e.fault.faultCode.toString()); } private function resultListar(e:ResultEvent):void{ dgUsuarios.dataProvider = e.result as Array; } private function selecionaUsuario():void{ selectedPerson = Usuario(dgUsuarios.selectedItem); } <mx:Button x="10" y="10" label="Listar usuários" click="listar()"/> <mx:DataGrid x="10" y="40" width="400" id="dgUsuarios" itemClick="selecionaUsuario()" height="144"> <mx:columns> <mx:DataGridColumn headerText="Nome completo" dataField="Nome"/> <mx:DataGridColumn headerText="E-mail" dataField="Email"/> <mx:DataGridColumn headerText="Endereço" dataField="Endereco"/> </mx:columns> </mx:DataGrid> <mx:Label x="128" y="208" text="{selectedPerson.ID}"/> <mx:Label x="128" y="234" text="{selectedPerson.Nome}"/> <mx:Label x="128" y="260" text="{selectedPerson.Email}"/> <mx:Label x="126" y="286" text="{selectedPerson.Endereco}"/>
  • 24. Podemos melhorar a conexão Criar uma classe global que fará a conexão e em caso de erro apresente em um Alert e em sucesso retorne para a nossa função: public class RemoteObjectAMFPHP extends RemoteObject{ public function RemoteObjectAMFPHP():void{ super("CanalAmfphp") } public function Remoto(_source:String, result:Function):void{ this.source = _source; this.showBusyCursor = true; this.addEventListener(ResultEvent.RESULT, result); this.addEventListener(FaultEvent.FAULT, Falha); } private function Falha(e:FaultEvent):void{ Alert.show(e.fault.faultString, e.fault.faultCode.toString()); } }
  • 25. Podemos melhorar a conexão Deste modo a chamada fica mais simples: private function listar():void{ var remote:RemoteObjectAMFPHP = new RemoteObjectAMFPHP() remote.Remoto("vo.UsuarioService", resultListar); remote.getOperation("Listar").send(); } private function resultListar(e:ResultEvent):void{ dgUsuarios.dataProvider = e.result as Array; }
  • 26. Falando de segurança Nunca estamos seguros o suficiente
  • 27. Métodos abertos • Cuidado com métodos que somente serão acessados por usuário logado; • Cuidado com classes que manipulam banco de dados, nunca as deixe dentro da pasta “services”; • Cuidado com métodos que apagam arquivos; • Nunca envie as senhas, mesmo criptografadas, nos métodos que os listam. • Antes de publicar não esquerça de apagar as pastas amfphp/browser e amfphp/services/amfphp
  • 28. Sempre o Upload Quem que não tem um arquivo upload.php com o seguinte conteudo? <?php $strOrigem = $_FILES['Filedata'] ['tmp_name']; $strDestino = "../upload/".$_FILES['Filedata']['name']; if(!move_uploaded_file ($strOrigem, $strDestino)){ $erroUp->erro("Erro ao mover"); } else{ $erroUp->erro("Movido com sucesso"); } ?>
  • 30. Para onde ir agora • http://blog.mxml.com.br/ • http://www.amfphp.org/ • http://www.adobe.com/devnet/flex/ • http://www.adobe.com/devnet/flex/tourdeflex/ • http://www.adobe.com/devnet/flex/flex_php.html • http://flex.org/ • http://livedocs.adobe.com/flex/3/langref/ • http://livedocs.adobe.com/flex/3/html/ • http://opensource.adobe.com