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

23 thoughts on “Adobe Flex com PHP usando ZendAMF – primeiros passos

  1. Leonardo França Post author

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

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

  3. Robinho

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

    Obrigado!

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

  5. Inacio

    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

  6. Leonardo França Post author

    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

  7. clebio vieira

    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:

  8. clebio vieira

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

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

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

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

Leave a Reply