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.
Recomendo os seguintes livros do meu amigo Daniel Pace Schmitz
Desenvolvendo Sistemas com Flex e PHP
Outros livros:
Flex 3 em Ação
Adobe Flex 3 Treinamento Direto da Fonte
Translations:
English Version
19 Comments
Other Links to this Post
-
Leonardo França » Adobe Flex with PHP using ZendAMF – first steps — August 24, 2010 @ 00:22
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
By Matheus, May 26, 2010 @ 15:51
Toda vez que tento acessar o gateway.php, pelo wamp, ele coloca o arquivo pra ser feito o download. Não interpreta.
Sabe alguma coisa que posso fazer?
Abs
By Robinho, June 14, 2010 @ 15:46
Ao executar o arquivo gateway.php é efetuado o download do mesmo. Poderia me ajudar?
Obrigado!
By Wilson Neto, June 18, 2010 @ 09:16
O mesmo acontece comigo, Ele pede para fazer download do gateway.php.
Estou usando Wamp (php 5.2.8) e ZendAmf 1.10.5.
Abraços
Wilson
By Inacio, June 30, 2010 @ 14:44
Localmente tudo esta perfeito.
Ao publicar no meu dominio a app nao consegue encontrar endpoint. Mas se eu entre pelo navegador com endereco do endpoint aparece a mensagem ” Zend Amf Endpoint “. O problema sera que esta no dominio ou em alguma configuracao do apache ou php ?
At. Inácio dos Santos
By Ved, July 11, 2010 @ 12:14
Hey hey hey: me ajudou a encontrar um bug! Obrigado! o/
By Leonardo França, July 12, 2010 @ 14:00
que bug vc achou Ved? vi que nas ultimas versões falta o arquivo Zend\Loader\Exception.php. Agora to com erro nos nomes dos pacotes que colocam em caixa alta
By clebio vieira, July 31, 2010 @ 17:01
Oi Leonardo, segui todos os exemplos. Só que não está Cadastrando. Quando clico no botão atualizar ele não faz nada e no botão excluir ele diz que um item deve ser selecionado. O link com o gateway.php está ok. As classes PHP E AS devem estar na mesma pasta ? pq meu “projeto” ficou a parte Flex no meus documentos e a pasta output e os arquivos php tão dentro do WWW DO WAMP.
SEGUE MEU CONSOLE: Code: 0
Detail: #0 C:\wamp\www\ZendLeonardo\php\Zend\Amf\Server.php(550): Zend_Amf_Server->_dispatch(‘insertData’, Array, ‘br.com.leonardo…’)
#1 C:\wamp\www\ZendLeonardo\php\Zend\Amf\Server.php(626): Zend_Amf_Server->_handle(Object(Zend_Amf_Request_Http))
#2 C:\wamp\www\ZendLeonardo\php\gateway.php(17): Zend_Amf_Server->handle()
#3 {main}
String: Class “br_com_leonardofranca_Contatos” does not exist: Plugin by name ‘Br_com_leonardofranca_Contatos’ was not found in the registry; used paths:
By clebio vieira, July 31, 2010 @ 18:46
RESOLVIDO: NO REMOTE OBJECTS ALTEREI DE:
source=”br.com.leonardofranca.Contatos”
PARA source=”Contatos”
Agora está funcionado normalmente.
abs…
By Leonardo França, August 1, 2010 @ 20:59
esse é um bug que esta sendo trabalhado para ser resolvido na versao 1.11
http://framework.zend.com/issues/browse/ZF-10174