SlideShare uma empresa Scribd logo
1 de 31
Baixar para ler offline
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"
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

Mais procurados

Novas APIs do Java EE 7: JMS e Web Services
Novas APIs do Java EE 7: JMS e Web ServicesNovas APIs do Java EE 7: JMS e Web Services
Novas APIs do Java EE 7: JMS e Web ServicesHelder da Rocha
 
Implementação em ActionScript 3 do Protocolo IRC
Implementação em ActionScript 3 do Protocolo IRCImplementação em ActionScript 3 do Protocolo IRC
Implementação em ActionScript 3 do Protocolo IRCJosé Travado
 
Exemplo caso de uso(Mulesoft)
Exemplo caso de uso(Mulesoft)Exemplo caso de uso(Mulesoft)
Exemplo caso de uso(Mulesoft)Guilherme Baccas
 
Java 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto Alegre
Java 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto AlegreJava 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto Alegre
Java 8 - Afinal onde usamos no dia a dia? TDC 2015 - Porto AlegreFrederico Maia Arantes
 
Usando seu codigo java no mule part 2
Usando seu codigo java no mule part 2Usando seu codigo java no mule part 2
Usando seu codigo java no mule part 2Jeison Barros
 
PHP Aula 05 - E-mails, Cookies e Sessoes
PHP Aula 05 - E-mails, Cookies e SessoesPHP Aula 05 - E-mails, Cookies e Sessoes
PHP Aula 05 - E-mails, Cookies e SessoesDaniel Brandão
 
Web 2.0 e AJAX - Parte 2 / 3
Web 2.0 e AJAX - Parte 2 / 3Web 2.0 e AJAX - Parte 2 / 3
Web 2.0 e AJAX - Parte 2 / 3David Ruiz
 
PHP RESTful Web Services - PHPConf'09
PHP RESTful Web Services - PHPConf'09PHP RESTful Web Services - PHPConf'09
PHP RESTful Web Services - PHPConf'09Felipe Ribeiro
 
Minicurso de PHP Com Ajax
Minicurso de PHP Com AjaxMinicurso de PHP Com Ajax
Minicurso de PHP Com AjaxAdler Medrado
 
A Biblioteca cURL
A Biblioteca cURLA Biblioteca cURL
A Biblioteca cURLricardophp
 
Proxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testesProxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testesStanislaw Pusep
 
Como criar um plugin para WordPress
Como criar um plugin para WordPressComo criar um plugin para WordPress
Como criar um plugin para WordPressLeandrinho Vieira
 
Integração Postfix Active Directory
Integração Postfix Active DirectoryIntegração Postfix Active Directory
Integração Postfix Active DirectoryThiago Cavalcante
 
LabMM4 (T16 - 12/13) - PHP + MySQL
LabMM4 (T16 - 12/13) - PHP + MySQLLabMM4 (T16 - 12/13) - PHP + MySQL
LabMM4 (T16 - 12/13) - PHP + MySQLCarlos Santos
 
Zabbix monitorando o zimbra collaboration 8.8 (1)
Zabbix   monitorando o zimbra collaboration 8.8 (1)Zabbix   monitorando o zimbra collaboration 8.8 (1)
Zabbix monitorando o zimbra collaboration 8.8 (1)PAULO R. DEOLINDO JUNIOR
 

Mais procurados (17)

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

Destaque

Informatics%20 Broschuere Sap[1]
Informatics%20 Broschuere Sap[1]Informatics%20 Broschuere Sap[1]
Informatics%20 Broschuere Sap[1]a_peter
 
Informatics%20 Broschuere Rta[1]
Informatics%20 Broschuere Rta[1]Informatics%20 Broschuere Rta[1]
Informatics%20 Broschuere Rta[1]a_peter
 
RSS 2012 Literature Searches
RSS 2012 Literature SearchesRSS 2012 Literature Searches
RSS 2012 Literature SearchesWesam Abuznadah
 
Plano Inova Empresa - Edital Nanotecnologia
Plano Inova Empresa - Edital NanotecnologiaPlano Inova Empresa - Edital Nanotecnologia
Plano Inova Empresa - Edital Nanotecnologia24x7 COMUNICAÇÃO
 
Informatics%20 Broschuere Ish[1]
Informatics%20 Broschuere Ish[1]Informatics%20 Broschuere Ish[1]
Informatics%20 Broschuere Ish[1]a_peter
 
SHS ASQ 2010 Conference Presentation: Hospital System Patient Flow
SHS ASQ 2010 Conference Presentation: Hospital System Patient FlowSHS ASQ 2010 Conference Presentation: Hospital System Patient Flow
SHS ASQ 2010 Conference Presentation: Hospital System Patient FlowAlexander Kolker
 
2013session1 3
2013session1 32013session1 3
2013session1 3acvq
 

Destaque (8)

Informatics%20 Broschuere Sap[1]
Informatics%20 Broschuere Sap[1]Informatics%20 Broschuere Sap[1]
Informatics%20 Broschuere Sap[1]
 
Informatics%20 Broschuere Rta[1]
Informatics%20 Broschuere Rta[1]Informatics%20 Broschuere Rta[1]
Informatics%20 Broschuere Rta[1]
 
RSS 2012 Literature Searches
RSS 2012 Literature SearchesRSS 2012 Literature Searches
RSS 2012 Literature Searches
 
Plano Inova Empresa - Edital Nanotecnologia
Plano Inova Empresa - Edital NanotecnologiaPlano Inova Empresa - Edital Nanotecnologia
Plano Inova Empresa - Edital Nanotecnologia
 
Traumatic Brain Injury
Traumatic Brain InjuryTraumatic Brain Injury
Traumatic Brain Injury
 
Informatics%20 Broschuere Ish[1]
Informatics%20 Broschuere Ish[1]Informatics%20 Broschuere Ish[1]
Informatics%20 Broschuere Ish[1]
 
SHS ASQ 2010 Conference Presentation: Hospital System Patient Flow
SHS ASQ 2010 Conference Presentation: Hospital System Patient FlowSHS ASQ 2010 Conference Presentation: Hospital System Patient Flow
SHS ASQ 2010 Conference Presentation: Hospital System Patient Flow
 
2013session1 3
2013session1 32013session1 3
2013session1 3
 

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

Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o JavascriptMichel Ribeiro
 
VRaptor - Alta produtividade no Desenvolvimento Web em Java
VRaptor - Alta produtividade no Desenvolvimento Web em JavaVRaptor - Alta produtividade no Desenvolvimento Web em Java
VRaptor - Alta produtividade no Desenvolvimento Web em JavaDaniel Faria Gomes
 
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1Thyago Maia
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Elton Minetto
 
HTTP, JSON, REST e AJAX com AngularJS
HTTP, JSON, REST e AJAX com AngularJSHTTP, JSON, REST e AJAX com AngularJS
HTTP, JSON, REST e AJAX com AngularJSRodrigo Branas
 
JavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersJavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersHarlley Oliveira
 
Entre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanEntre na fila. Processamento distribuído usando Gearman
Entre na fila. Processamento distribuído usando GearmanElton Minetto
 
Lidando com desafios dos microserviços com a stack Spring Cloud Netflix
Lidando com desafios dos microserviços com a stack Spring Cloud NetflixLidando com desafios dos microserviços com a stack Spring Cloud Netflix
Lidando com desafios dos microserviços com a stack Spring Cloud NetflixEmmanuel Neri
 
Interagindo com web services RPC, SOAP e REST utilizando PHP
Interagindo com web services RPC, SOAP e REST utilizando PHPInteragindo com web services RPC, SOAP e REST utilizando PHP
Interagindo com web services RPC, SOAP e REST utilizando PHPEduardo Cesar
 
Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010Oficina postgresql avançado_consegi2010
Oficina postgresql avançado_consegi2010Fabrízio Mello
 
Consumindo dados via web service no android
Consumindo dados via web service no androidConsumindo dados via web service no android
Consumindo dados via web service no androidAlexandre Antunes
 

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

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

Mais de elliando dias

Clojurescript slides
Clojurescript slidesClojurescript slides
Clojurescript slideselliando dias
 
Why you should be excited about ClojureScript
Why you should be excited about ClojureScriptWhy you should be excited about ClojureScript
Why you should be excited about ClojureScriptelliando dias
 
Functional Programming with Immutable Data Structures
Functional Programming with Immutable Data StructuresFunctional Programming with Immutable Data Structures
Functional Programming with Immutable Data Structureselliando dias
 
Nomenclatura e peças de container
Nomenclatura  e peças de containerNomenclatura  e peças de container
Nomenclatura e peças de containerelliando dias
 
Polyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better AgilityPolyglot and Poly-paradigm Programming for Better Agility
Polyglot and Poly-paradigm Programming for Better Agilityelliando dias
 
Javascript Libraries
Javascript LibrariesJavascript Libraries
Javascript Librarieselliando dias
 
How to Make an Eight Bit Computer and Save the World!
How to Make an Eight Bit Computer and Save the World!How to Make an Eight Bit Computer and Save the World!
How to Make an Eight Bit Computer and Save the World!elliando dias
 
A Practical Guide to Connecting Hardware to the Web
A Practical Guide to Connecting Hardware to the WebA Practical Guide to Connecting Hardware to the Web
A Practical Guide to Connecting Hardware to the Webelliando dias
 
Introdução ao Arduino
Introdução ao ArduinoIntrodução ao Arduino
Introdução ao Arduinoelliando dias
 
Incanter Data Sorcery
Incanter Data SorceryIncanter Data Sorcery
Incanter Data Sorceryelliando dias
 
Fab.in.a.box - Fab Academy: Machine Design
Fab.in.a.box - Fab Academy: Machine DesignFab.in.a.box - Fab Academy: Machine Design
Fab.in.a.box - Fab Academy: Machine Designelliando dias
 
The Digital Revolution: Machines that makes
The Digital Revolution: Machines that makesThe Digital Revolution: Machines that makes
The Digital Revolution: Machines that makeselliando dias
 
Hadoop - Simple. Scalable.
Hadoop - Simple. Scalable.Hadoop - Simple. Scalable.
Hadoop - Simple. Scalable.elliando dias
 
Hadoop and Hive Development at Facebook
Hadoop and Hive Development at FacebookHadoop and Hive Development at Facebook
Hadoop and Hive Development at Facebookelliando dias
 
Multi-core Parallelization in Clojure - a Case Study
Multi-core Parallelization in Clojure - a Case StudyMulti-core Parallelization in Clojure - a Case Study
Multi-core Parallelization in Clojure - a Case Studyelliando dias
 

Mais de elliando dias (20)

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

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"
  • 13.
  • 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