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]
< ?php require_once 'Zend/Amf/Server.php'; $server = new Zend_Amf_Server(); $server->setProduction(false);
echo($server->handle());
?>
[/PHP]
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]
< ?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;
}
}
?>
[/PHP]
Em seguida, nossa classe principal, que efetuará as operações de listar, inserir, apagar e atualizar os dados do nosso banco:
[PHP]
< ?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() { $this->conexao = mysql_connect(“localhost”,”root”,””);
mysql_select_db(“java”);
}

public function getData()
{
$this->sql = “SELECT id, nome, email FROM tabela”;
$this->query = mysql_query($this->sql);
$this->num = mysql_num_rows($this->query);
if ($this->num>0)
{
while ($this->row = mysql_fetch_assoc($this->query))
{
$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.”‘)”;
$this->query = mysql_query($this->sql);
if (!mysql_error())
{
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″;
$this->query = mysql_query($this->sql);
if (!mysql_error())
{
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.”‘”;
$this->query = mysql_query($this->sql);
if (!mysql_error())
{
return true;
}
else
{
return false;
}
}

}
?>
[/PHP]
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]
< ?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());
?>
[/PHP]
Adicionamos a chamada para nossa classe de implementação e mapeamos o vo, feito isto, vamos a parte mais dificil agora :P,
pegamos o mesmo arquivo mxml do artigo anterior e modificaremos a seguinte linha:
[MXML]
< mx : RemoteObject id="ro" destination="zendamf" source="br.com.leonardofranca.Contatos" endpoint="http://localhost/ZendAmf/gateway.php">

[/MXML]
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

Flex, PHP, ZendAMF , ,

23 comments


  1. Muito elucidativo o trabalho. Obrigado.

  2. Código fonte? teria como disponibilizar para download.
    =]

  3. fonte disponibilizado 😉

  4. Muito obrigado pelos esclarecimentos, embora eu ache que por mais que eu tenho estudado, menos eu sei.
    Um abraço!

  5. Interessante, mas já que está usando o zend, não seria interessante usar também a biblioteca DB do zend?

  6. Sim, poderia usar perfeitamente, mas o objetivo foi mostrar que é possivel migrar o legado do AMFPHP sem problemas e sem dependencia do ZendFramework 😉

  7. 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

  8. $this->dados[] = $contatosVO
    return($this->dados);

    Como eu posso usar os dados retornados preenchendo campos texto ?

    Alguem pode me ajudar

  9. no cliente, vc vai usar assim:
    meutexto.text = re.message.body.nomedocampo

  10. Matheus

    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

  11. Robinho

    Ao executar o arquivo gateway.php é efetuado o download do mesmo. Poderia me ajudar?

    Obrigado!

  12. Wilson Neto

    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

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

  14. Ved

    Hey hey hey: me ajudou a encontrar um bug! Obrigado! o/

  15. 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

  16. 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:

  17. RESOLVIDO: NO REMOTE OBJECTS ALTEREI DE:
    source=”br.com.leonardofranca.Contatos”
    PARA source=”Contatos”
    Agora está funcionado normalmente.
    abs…

  18. esse é um bug que esta sendo trabalhado para ser resolvido na versao 1.11
    http://framework.zend.com/issues/browse/ZF-10174

  19. Pingback: Leonardo França » Adobe Flex with PHP using ZendAMF – first steps

  20. Claudio

    Caro Leonardo,

    To desenvolvendo uma aplicação com Flex Spark, SQLServer 2008 e PHP ZendAMF.
    O flex em “Configure Return Type” gera o typo String e não me deixa alterar.
    As textos grandes estão truncados com 254 caracteres…
    Como resolver ?
    Obrigado,
    Claudio Ribeiro

  21. Gilsones

    Vejo que você fez a conexão usando o mysql_connect, o Flash Builder 4 gera o script com mysqli, também direto (Sem uso do Zend Framework).
    Sou meio novo no assunto e tenho uma dúvida:
    Não seria viável usar o ZendFramework ( Zend_Db_Table) ou o ZendAMF ja é bem seguro?

  22. fiz assim pq ainda era um codigo migrado do que usava no AMFPHP, nada impede de usar o Zend_Db, inclusive ja utilizo em alguns projetos

  23. Obrigado pelas informações conteúdo excelente valeu:)

Leave a Reply