Adobe Flex com PHP usando ZendAMF – primeiros passos

Não é novidade o apoio da Adobe com tecnologias que se integrem perfeitamente com o Flex, A Zend, que mantém o PHP, tem no seu ZendFramework, um pacote chamado ZendAMF, para implementar essa integração entre o Flex e o PHP. Nas mãos de Wade Arnold, que também mantem o AMFPHP.
Demorei um certo tempo para começar a usar essa implementação, ja havia me acostumando com o AMFPHP e feito varios sistemas com ele. No entanto, a propría Adobe recomenda o uso do ZendAMF para construção de RIA's com Flex e PHP.
Como primeiro exemplo usando o ZendAMF, usarei o mesmo banco de dados feito no artigo anterior sobre Flex e Java.
Uma das vantagens do Flex foi idealizado para ser a camada de visão e isso permite que a camada de negócios fique transparente, podendo usar tanto Java, PHP ou .NET, precisando somente apontar para um endpoint diferente de acordo com sua necessidade.
Você pode baixar a ultima versão do ZendAMF no seguinte link. Detalhe importante, você não precisa baixar todo o ZendFramework para utilizar esse pacote.
Feito isso, descompacte os arquivos no diretorio de sua preferência, no meu caso, criei um chamado "ZendAmf" e certifique-se que contenha o diretorio "Zend".
O objetivo é não mudar quase em nada a forma de organização da qual era no AMFPHP. Portanto para testar o nosso AMF, vamos criar um arquivo chamado "gateway.php" contento o seguinte código:
-
<?php
-
require_once 'Zend/Amf/Server.php';
-
$server = new Zend_Amf_Server();
-
$server->setProduction(false);
-
echo($server->handle());
-
?>
Executando o link no seu navegador, deve aparecer a seguinte mensagem:
Zend Amf Endpoint
O ZendAMF esta pronto para nosso desenvolvimento, procurei manter a estrutura de diretorios o mais parecido possivel com o que já tinha feito no java, portanto, criaremos o seguinte diretorio para nosso VO; br.com.leonardofranca.vo e br.com.leonardofranca para a classe principal. A estrutura deve ficar da seguinte forma:
Zend
br/com/leonardofranca/vo
br/com/leonardofranca
gateway.php
O nosso VO no PHP ficaria da seguinte forma:
-
<?php
-
class ContatosVO
-
{
-
public $_explicitType = 'br.com.leonardofranca.vo.ContatosVO';
-
public $id = 0;
-
public $nome = "";
-
public $email = "";
-
-
function __construct()
-
{
-
-
}
-
-
public function getId()
-
{
-
return $this->id;
-
}
-
-
public function setId($id)
-
{
-
$this->id = $id;
-
}
-
-
public function getNome()
-
{
-
return $this->nome;
-
}
-
-
public function setNome($nome)
-
{
-
$this->nome = $nome;
-
}
-
-
public function getEmail()
-
{
-
return $this->email;
-
}
-
-
public function setEmail($email)
-
{
-
$this->email = $email;
-
}
-
}
-
?>
Em seguida, nossa classe principal, que efetuará as operações de listar, inserir, apagar e atualizar os dados do nosso banco:
-
<?php
-
/*
-
* author Leonardo França
-
* site http://www.leonardofranca.com.br
-
*/
-
require_once 'vo/ContatosVO.php';
-
-
class Contatos
-
{
-
private $conexao;
-
private $sql;
-
private $query;
-
private $num;
-
private $dados;
-
public $contatosVO;
-
-
function __construct()
-
{
-
}
-
-
public function getData()
-
{
-
$this->sql = "SELECT id, nome, email FROM tabela";
-
if ($this->num>0)
-
{
-
{
-
$contatosVO = new ContatosVO();
-
$contatosVO->setNome($this->row['nome']);
-
$contatosVO->setEmail($this->row['email']);
-
$contatosVO->setId($this->row['id']);
-
$this->dados[] = $contatosVO;
-
}
-
return($this->dados);
-
}
-
else
-
{
-
return false;
-
}
-
-
}
-
-
public function insertData($contatosVO=ContatosVO)
-
{
-
$this->contatosVO = $contatosVO;
-
$this->sql = "INSERT INTO tabela (nome,email) VALUES
-
('".$this->contatosVO->nome."',
-
'".$this->contatosVO->email."')";
-
{
-
return true;
-
}
-
else
-
{
-
return false;
-
}
-
}
-
-
public function deleteData($contatosVO=ContatosVO)
-
{
-
$this->contatosVO = $contatosVO;
-
$this->sql = "DELETE FROM tabela WHERE id = '".$this->contatosVO->id."' LIMIT 1";
-
{
-
return true;
-
}
-
else
-
{
-
return false;
-
}
-
}
-
-
public function updateData($contatosVO=ContatosVO)
-
{
-
$this->contatosVO = $contatosVO;
-
$this->sql = "UPDATE tabela SET nome = '".$this->contatosVO->nome."', email = '".$this->contatosVO->email."' WHERE id = '".$this->contatosVO->id."'";
-
{
-
return true;
-
}
-
else
-
{
-
return false;
-
}
-
}
-
-
}
-
?>
Até aqui, nenhum misterio, temos uma classe simples que utiliza um objeto tipado, agora vamos editar o arquivo "gateway.php" para que possa chamar nosso vo e a classe de implementação:
-
<?php
-
require_once 'Zend/Amf/Server.php';
-
require_once 'br/com/leonardofranca/vo/ContatosVO.php';
-
require_once 'br/com/leonardofranca/Contatos.php';
-
-
/** Bootstrap */
-
-
// Instantiate server
-
$server = new Zend_Amf_Server();
-
$server->setProduction(false);
-
//$server->addDirectory('services/');
-
// reflection
-
$server->setClass('Contatos');
-
$server->setClassMap('ContatosVO',"br.com.leonardofranca.vo.ContatosVO");
-
// Handle request
-
echo($server->handle());
-
?>
Adicionamos a chamada para nossa classe de implementação e mapeamos o vo, feito isto, vamos a parte mais dificil agora
,
pegamos o mesmo arquivo mxml do artigo anterior e modificaremos a seguinte linha:
-
<mx : RemoteObject id="ro" destination="zendamf" source="br.com.leonardofranca.Contatos" endpoint="http://localhost/ZendAmf/gateway.php">
-
<!-- <mx : RemoteObject id="ro" destination="blazeds" source="br.com.leonardofranca.Contatos" endpoint="http://localhost:8080/Contatos/messagebroker/amf"> -->
De resto, não precisei modificar em nada a programação no Flex, o objetivo aqui foi mostrar de uma maneira simples, como podemos ter uma camada de visão rica com o Adobe Flex, independentemente da camada de negócios.
Mais sobre o ZendAMF:
http://wadearnold.com/blog/?page_id=155
http://framework.zend.com/download/amf
http://framework.zend.com/wiki/display/ZFPROP/Zend_Amf+-+Wade+Arnold
UPDATE
Nas ultimas versões do ZendAmf, é necessario alguns pacotes que constam no ZendFramework, uma opção é ir adicionando os pacotes no seu projeto ou usar todo o ZendFramework.
Translations:
English Version
9 Comments
Other Links to this Post
RSS feed for comments on this post. TrackBack URI


By Adriano, April 29, 2009 @ 16:36
Muito elucidativo o trabalho. Obrigado.
By CalRaiden, May 4, 2009 @ 16:28
Código fonte? teria como disponibilizar para download.
=]
By Leonardo França, May 4, 2009 @ 23:36
fonte disponibilizado
By Leia Pimenta, June 9, 2009 @ 13:19
Muito obrigado pelos esclarecimentos, embora eu ache que por mais que eu tenho estudado, menos eu sei.
Um abraço!
By CalRaiden©, July 28, 2009 @ 11:18
Interessante, mas já que está usando o zend, não seria interessante usar também a biblioteca DB do zend?
By Leonardo França, July 28, 2009 @ 15:24
Sim, poderia usar perfeitamente, mas o objetivo foi mostrar que é possivel migrar o legado do AMFPHP sem problemas e sem dependencia do ZendFramework
By Componentes Eletrônicos, October 20, 2009 @ 17:18
Php zend é show, pena termos poucos certificados no BR , ainda sim vale estudar … parabéns pelo blog.
Segue minha e-commerce: http://www.supertech-comp.com.br
By Luiz Barros, November 24, 2009 @ 17:51
$this->dados[] = $contatosVO
return($this->dados);
Como eu posso usar os dados retornados preenchendo campos texto ?
Alguem pode me ajudar
By Leonardo França, December 8, 2009 @ 11:59
no cliente, vc vai usar assim:
meutexto.text = re.message.body.nomedocampo