ZendAMF – Novidade, analise (vs amfPHP) e tutorial



Este é o mais recente logo de uma das frameworks de php mais conceituadas da actualidade. Não vou falar da framework apesar desta ter muito que falar, mas vou falar sim de um componente AMF desta nova framework intitulado ZendAMF, que como o amfPHP serve para comunicação de dados do PHP com a plataforma Flash.
Tudo isto deve-se à politica de globalização da plataforma flash por parte da Adobe, que abriu o formato AMF para a comunidade. Nas bastando isso, a adobe ainda se aliou à Zend e junto com um dos autores do amfPHP – (Wade Arnold) – desenvolveram uma aliaça conjunta que resultou no Zend AMF que depois de ter passado do papel veio a publico com o seu download disponibilizado oficialmente na pagina da zend.

 

Apesar de a minha primeira impressão ter sido absurdamente rude (não gostei do impacto de tanta pasta no ficheiro de download) depois de apenas uns minutos de volta do sistema reparei que o seu uso ainda é mais simples que o amfPHP, e pelas experiencias que fiz parece ser mais rápido que o amfPHP, nao esquecendo também a necessidade absoluta do PHP5.

 

Apenas vasculhei os ficheiros o suficiente para vos demonstrar o simples uso no flex deste novo ZendAMF.

Vamos então a um pequeno tutorial… 

- O primeiro passo é fazer o download do zendAMF.

- De seguida, ter um servidor *AMP:  Apache + MySQL + PHP (5)

- Finalmente seguir os passos seguintes atentamente:

Antes de configurar as minhas pastas, vou explicar o meu sistema: Tenho o WAMP Server instalado na pasta C:\wamp, com o domain “localhost” e a raiz do servidor em c:\wamp\www 

Vou então à minha pasta do www e crio uma pasta flex e dentro dela um testTend ficando com os caminhos: c:\wamp\www\flex\testZend

Abram o arquivo que fizeram download : ZendAMF-1.7.3.zip percorram a pasta library/ e extraiam apenas a pasta Zend para c:\wamp\www\flex\testZend. Esta é a pasta necessaria ao funcionamento do zendAMF, como se fosse a pasta “amfphp” do amfPHP. Vou agora explicar o funcionamento deste zendAMF, que ao contrario do amfPHP não possui uma estrutura obrigatória de pastas, mas para que ele funcione devidamente teremos que providenciar alguns detalhes como um gateway e uma classe.

O conhecido amfPHP usa um ficheiro gateway.php para definir as classes e estruturas de dados e que regra geral nao temos que mexer nele, o zendAMF não usa e nem sequer traz este gateway.php, mas teremos de criar um ficheiro que funciona +- da mesma maneira. Para isso criem um ficheiro index.php (será o nosso gateway) e dentro dele coloquem o código seguinte:

 

<?php
        
//debug, nao necessário
    
error_reporting(E_ALL | E_STRICT);
    
ini_set("display_errors", "on");
 
        
//importa o server, servidor ZendAMF e de seguida importa a nossa class (serviço no amfPHP) TutorialZend
    
require_once "Zend/Amf/Server.php";
    
require_once "TutorialZend.php";
 
        
//inicia o servidor e de seguida indica que a nossa class TutorialZend deve fazer parte do zendAMF para serializar
    
$server = new Zend_Amf_Server();
    
$server->setClass("TutorialZend");
 
        
//necessário para que o flex/flash identifique o endPoint.
    
echo($server->handle());
?>

Este é o nosso gateway, onde importo a minha primeira class: require_once “TutorialZend.php”; e onde digo ao “Servidor AMF” que deve usa-la: $server->setClass(“TutorialZend”);

Para mais que uma class basta usarem repetidamente os comandos, require_once “minha_classe_2.php”; e $server->setClass(“minha_class_2″); ficando também estas acessiveis no zendAMF para remoting.

Guardem o ficheiro como index.php na pasta: c:\wamp\www\flex\testZend\ e vamos agora criar a nossa primeira classe, que aqui sim funciona como no amfPHP, neste caso criar a class necessária ao gateway, a classe TutorialZend (.php) criando entao o ficheiro TutoriaZend.php onde vamos escrever uma função para ir buscar dados a uma tabela users, escrevendo o seguinte:

 <?php
 
define("DATABASE_SERVER", "localhost");
 
//definam a vossa password e nome de utilizador
define("DATABASE_USERNAME", "username");
define("DATABASE_PASSWORD", "password");
 
define("DATABASE_NAME", "zend");
 
    
class TutorialZend {
                
//esta é uma das diferenças entre amfPHP e o zendAMF, aqui é usado o __construct() em vez do nome da class, TutorialZend().
        
public function __construct() {
            
$mysql = mysql_connect(DATABASE_SERVER, DATABASE_USERNAME, DATABASE_PASSWORD);
            
mysql_select_db(DATABASE_NAME);
        
}
 
                
//função para buscar os dados à bd mysql.
        
public function getUsers() {
 
            
$query = "SELECT id, nome, email FROM users";
        
$result = mysql_query($query);
 
        
$res = array();
 
 
        
while ($row = mysql_fetch_assoc($result)) {
                
array_push($res, $row);
            
}
 
        
mysql_free_result($result);
        
return $res;
 
 
        
}
    
}
?>

 

E temos a nossa class feita. Só fica mesmo a faltar a nossa base de dados zend e a nossa tabela users, para isso criem a base de dados zend e executem a seguinte instrução:

CREATE TABLE IF NOT EXISTS `users` (  `id` int(11) NOT NULL auto_increment`nome` varchar(255) NOT NULL`email` varchar(255) default NULLPRIMARY KEY  (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
 
INSERT INTO `users` (`id`, `nome`, `email`) VALUES (1, 'Mario', 'admin@msdevstudio.com'), (2, 'Ze carlos', 'zecarlos@sic.pt'), (3, 'Antonio', 'antoni@rail-uk.com'), (4, 'Sousa', 'sfranco@spo.pt');

E pronto, temos a tabela users já com dados… só falta mesmo ligar o flex ao nosso zend.

 

No flex basta criarem um novo projecto,

File->New->Flex Project colocando o nome testZend escolhendo como server type : PHP, clicando em seguinte basta introduzir as cordenadas que usei em cima:

Web Root: C:\wamp\www\flex\testZend e Web Root URL: http://localhost/flex/testZend cliquem em Validate Configuration e depois em Finish.

O projecto está criado, e para que o flex se ligue ao zend AMF é necessário também um ficheiro services-config.xml o qual podem encontrar em baixo e onde definimos o nosso gateway, neste caso o index.php podendo ou nao enumera-lo:

 

<?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="zend">
                
<channels>
                    
<channel ref="my-zend"/>
                
</channels>
                
<properties>
                    
<source>*</source>
                
</properties>
            
</destination>
        
</service>
    
</services>
    
<channels>
        
<channel-definition id="my-zend" class="mx.messaging.channels.AMFChannel">
            
<endpoint uri="http://localhost/flex/testZend/" class="flex.messaging.endpoints.AMFEndpoint"/>
        
</channel-definition>
    
</channels>
</services-config>

 

Salvem o arquivo services-config.xml na pasta src ao lado do zendTest.mxml

Finalmente, coloquem-no como argumento na compilação, indo ao menu Project->Properties->Flex Compiler->Aditional compiler arguments, colocando  -locale en_US -services “services-config.xml” cliquem em Apply e o nosso projecto esta pronto a trabalhar com o zendAMF, basta usarem o código normal no amfPHP como remoteObject, mas definindo o destination como zend. Vejam o segunte código testZend.mxml:

 

<?xml version="1.0" encoding="utf-8"?>
<
mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" viewSourceURL="srcview/index.html">
    <
mx:Script>
        <!
[CDATA[
            
import mx.rpc.events.FaultEvent;
            
import mx.rpc.events.ResultEvent;
            
import mx.controls.Alert;
 
            
private function testZendIt():void {
                
myZendService.getUsers();
            
}
 
 
            
private function onResultado(res:ResultEvent):void {
 
                
var objRes:Object = res.result as Object;
                
myZendGrid.dataProvider=objRes;
            
}
 
            
private function onErro(erro:FaultEvent):void {
                
Alert.show(erro.toString());
            
}
 
        
]]>
    <
/mx:Script>
    <mx:RemoteObject id="myZendService" destination="zend" source="TutorialZend" >
        <mx:method name="getUsers" result="onResultado(event)" fault="onErro(event)"
/>
    <
/mx:RemoteObject>
    <mx:Canvas width="344" height="254" borderColor="#FFFFFF" backgroundColor="#FFFFFF" horizontalCenter="0" verticalCenter="0">
        <mx:Button x="20" y="19" label="Call Zend" click="testZendIt();" width="302"
/>
        <
mx:DataGrid x="20" y="49" id="myZendGrid">
            <
mx:columns>
                <
mx:DataGridColumn headerText="Id" dataField="id"/>
                <mx:DataGridColumn headerText="Nome" dataField="nome"
/>
                <
mx:DataGridColumn headerText="Email" dataField="email"/>
            <
/mx:columns>
        <
/mx:DataGrid>
        <mx:Image x="20" y="208" source="PoweredBy_ZF_4LightBG.png"
/>
        <
mx:Label x="217" y="199" text="ZEND AMF Tutorial"/>
        <mx:Label x="194" y="215" text="www.msdevstudio.com"
/>
    <
/mx:Canvas>
<
/mx:Application>
Basta correm-no e clicar no botão “Call Zend” para a vossa tabela ser preenchida com os dados do mysql vindos directinhos no php via ZendAMF como mostra a imagem em baixo :)
testZend; ZendAMF Tutorial
Simples hein?

Uma das grandes vantagens do uso do zendAMF é a possibilidade de mapear VO’s directamente na class Servidor, usando apenas: $server->setClassMap(“VOUser”, “VOUser”); ($server->setClassMap(“AS3Classe” , “PHPClasse”);) mas isso fica para a próxima.

Podem ver o projecto final online aqui, fazer o download do projecto aqui, o download do gateway: index.php e da classe TutorialZend.php.

Espero que seja util, e já agora contem as vossas experiencias… será que é um substituto à altura do amfPHP ?

 

Na minha opinião pessoal acho o zendAMF menos pesado, mais rapido e até mais simples de usar visto que podemos definir a estrutura de dados e classes… mas bom, ainda só estudei um pouco… brevemente darei mais noticias….

Abraço.

Deixe um comentário ou um Trackback
   

58 Comentários

  1. February 1, 2009 às 4:11 am | Permalink

    Muito boa essa notícia, visto que quanto mais tecnologia nova, melhor nossas experiência com o Flex. parabens pela materia… testarei logo..

  2. February 1, 2009 às 8:56 pm | Permalink

    Typo detectado :-) “… o amfphp não usa e nem sequer traz este gateway, pelo que teremos de o criar.”

    Ali querias dizer zendamf :)

  3. February 1, 2009 às 9:50 pm | Permalink

    Oswaldo, depois mande um comentário contado a sua experiencia! :)

    Marco, gracias! Corrigido :)

    Abraços.

  4. February 2, 2009 às 9:55 am | Permalink

    @Mário: Bom dia, quanto as minhas experiência, creio ser mínima, em relação a vocês, fazem 6 meses que trabalho com flex, mais graças a blogs como o seu, do Ved, entre outros, nos dão bastante suporte.JA tenho dois trabalhos realizados com Flex. E pretendo realizar mais…
    Agradeço.. abraço…e claro, parabéns pelo blog… esta inscritos em meus RSS

  5. Andre Luis
    February 4, 2009 às 11:02 pm | Permalink

    Estou com problemas em implementar o exemplo, quando chamo o botão Call Zend, ele retorna o seguinte erro:
    [FaultEvent fault=[RPC Fault faultString="Send failed" faultCode="Client.Error.MessageSend" faultDetail="Channel.Connect.Failed error NetConnection.Call.BadVersion: : url: 'http://localhost/flex/testZend/'"] messageId=”704CEAE6-4F79-79D1-C2F7-438698B7B27B” type=”fault” bubbles=false cancelable=true eventPhase=2].
    Se puderem me ajudar, pois sou iniciante e não estou conseguindo encontrar onde é o erro.

  6. February 4, 2009 às 11:18 pm | Permalink

    Boas Andre, pelo que parece é o teu php que está mal construido… abre o teu TutorialZend.php no browser e ve se dá erro… provavelmente deve haver algum erro…copias-te o código à mão? ou usaste o ficheiro que dei?

    Se copiaste o código à mão, pode ser da formatação aqui do texto no blog, que troca os ” por ” que sao caracteres diferentes aos olhos do php :P

    Ve se resolveu.. caso contrario usa o ficheiro que puz pra download.

    Abraço.

  7. Andre Luis
    February 5, 2009 às 10:35 am | Permalink

    Realmente eram códigos errados na hora de copiar e colar, problemas de iniciante.
    Mas parabéns pelo ótimo site e as dicas e novidades sempre nos dão mais animo para continuar.

  8. February 9, 2009 às 3:06 pm | Permalink

    po: gostei demais da parte de mapeamento de objetos, pois no AMFPHP é um parto e nem sempre funciona! Abração e obrigado por mais essa! Ved

  9. February 15, 2009 às 9:13 pm | Permalink

    Me ajude amigo. Quando eu testo, está aparecendo este ERRO para mim:

    [FaultEvent fault=[RPC Fault faultString="[MessagingError message='Destination 'zend' either does not exist or the destination has no channels defined (and the application does not define any default channels.)']” faultCode=”InvokeFailed” faultDetail=”Couldn’t establish a connection to ‘zend’”] messageId=”E2F45E60-8616-9D24-8730-7BC83363609C” type=”fault” bubbles=false cancelable=true eventPhase=2]

    Segui todos seus passos.

    Obrigado

    Eduardo Burko

  10. February 15, 2009 às 10:24 pm | Permalink

    Eduardo, você definiu o seu services-config.xml e colocou-o como aditional compiler arguments?? Tudo indica que nao o fez…

    será disso?

    Cumps.

  11. February 15, 2009 às 10:35 pm | Permalink

    Mario… realmente faltava colocar os novos ARGUMENTOS. Porém agora esta dando outro erro.

    [FaultEvent fault=[RPC Fault faultString="Send failed" faultCode="Client.Error.MessageSend" faultDetail="Channel.Security.Error error Error #2048 url: 'http://www.msdevstudio.com/blog/flexSource/testZend/'"] messageId=”53018C8C-AF46-704A-2C34-7C13AAA9A4C8″ type=”fault” bubbles=false cancelable=true eventPhase=2]

    Obrigado pela sua atenção.

    Eduardo

  12. February 15, 2009 às 10:42 pm | Permalink

    Eduardo, como pode ver está qualquer coisa mal no URL do remoteObject, pelo que parece você tem o endereço do meu blog (deveria se o do seu/ sua localização.) Siga as instruções deste post e nao use as fontes do meu exemplo porque estas estão configuradas para o meu servidor… assim é mais facil testar e aprender o seu funcionamento.

  13. February 15, 2009 às 10:47 pm | Permalink

    Mario… eu mudei ali para chamar no meu LOCALHOST no server-config, porém ainda dá um erro estranho.

    [FaultEvent fault=[RPC Fault faultString="Send failed" faultCode="Client.Error.MessageSend" faultDetail="Channel.Security.Error error Error #2048: Violação da área de segurança: http://localhost/flex/testZend/bin-debug/testZend.swf não pode carregar dados de http://www.msdevstudio.com/blog/flexSource/testZend/. url: 'http://www.msdevstudio.com/blog/flexSource/testZend/'"] messageId=”D5C0786C-0906-F95E-B4AE-7C1E2C3C584D” type=”fault” bubbles=false cancelable=true eventPhase=2]

  14. February 15, 2009 às 10:49 pm | Permalink

    Não sei se isso tem haver Mario, porém meu FLEX está criando o HTML e o SWF dentro de uma pasta chamada bin-debug. Será que pode ser isso ??

  15. February 15, 2009 às 10:50 pm | Permalink

    Eduardo, o seu services-config.xml continua com o endereço do meu blog. Deve alterar o seu services-config.xml e voltar a compilar a aplicação (um refresh nao chega).

    Em alguma parte continua com a referencia do meu blog.

  16. February 15, 2009 às 10:55 pm | Permalink

    Mario… funcionou agora… Bastava eu FECHAR o FLEX novamente e abrir. Porém gostaria de tirar duas dúvidas com você do começo deste TUTORIAL.

    1º – Tem uma parte lá em cima, onde colocamos WEB ROOT e ROOT URL, lembra ?? porém antes desta tela tem uma parte onde tenho que escolher o tipo de linguagem (escolhemos PHP), e tem uma parte chamado PROJECT LOCATION. Nesta parte do PROJECT LOCATION, você deixa ali marcado o PADRÂO que o FLEX deixa ?? Ou escolhe a mesma pasta nossa lá no WWW ??

    2º – Tem um botão logo abaixo do WEB ROOT e ROOT URL chamado VALIDADE CONECTION, quando eu aperto este botão ele me dá uma mensagem ali em cima assim: Cannot access the web server. The server may not be running, or the web root folder or root URL may be invalid. É assim mesmo ??

    Obrigado mais uma vez.

    Eduardo BUrko

  17. February 15, 2009 às 10:59 pm | Permalink

    Estava a achar estranho nao funcionar :P

    Como disse:
    “File->New->Flex Project colocando o nome testZend escolhendo como server type : PHP, clicando em seguinte basta introduzir as cordenadas que usei em cima:”

    Web Root: C:\wamp\www\flex\testZend e Web Root URL: http://localhost/flex/testZend cliquem em Validate Configuration e depois em Finish.

    Se clica em Validate Configuration e dá erro, algo se passsa, deveria dizer Web root & root url are valid! Verifique se as pastas estao correctas e se o seu servidor web esta a correr.

    E pronto, acho que é tudo! qq coisa disponha do fórum do blog: http://forum.msdevstudio.com

    Abraço.

  18. February 16, 2009 às 1:27 am | Permalink

    Mario… para fechar a minha dúvida sobre este exeplo, me diz uma coisa… como eu faço para acessar apenas o LOGIN do objeto objRes ??

    Tentei assim mas não funcionou…

    var objRes:Object = res.result as Object;
    var login:String = objRes.login;

    Obrigado mais uma vez.

  19. February 19, 2009 às 7:52 pm | Permalink

    Gostaria de fazer um crítica.

    Mario, o tutorial funcionou perfeitamente. Tive uma noção do que é o ZendAMF mas sinto que aprendi muito pouco.

    Pois para mim foi só um processo de copiar e colar e ver que funciona mas não sabia muito bem o que eu estava fazendo.

    Eu sou um usuário principiante de Flash/Flex, nunca fiz nada integrado com php, talvez seja por isso que esteja tendo tanta dificuldade.

  20. ocxy
    February 20, 2009 às 1:07 am | Permalink

    Mário, parabéns o tutorial me ajudou a dar os primeiros passo no ZendAMF, e pelo que andei lendo, acho que vou “ficar” com ele devido ao apoio da Adobe.

  21. February 20, 2009 às 7:46 am | Permalink

    Eduardo,
    O login?? mas na tabela nao existe qualquer campo login, pelo que nao existe no res.result…
    Se alterou a sua tabela e meteu mais um campo, no php deve colocar:

    $query = “SELECT * FROM users”;

    E assim todos os campos ficam disponiveis no flex na variavel evt.result. :)

    Bruno.
    O zendAMF funciona como o amfPHP (quase) pelo que aconselho a dar uma vista de olhos no meu tutorial de flex que explica passo a passo como funciona o amfphp e a integração com o flex, veja:
    http://msdevstudio.com/blog/2008/06/30/adobe-flex-a-partir-do-zero-livro-actualizado/
    pontos 9.x

    Aí verá que será mais facil entender estes sistemas de comunicação remota via AMF.

    ocxy, bem verdade que têm apoio da adobe, mas agora depois de algum tempo receio que para os iniciantes e sem muita experiencia no php seja dificil usa-lo já que não têm um explorer como o amfphp onde podes ver os erros do php, no zendAMF simplesmente não consegues saber o erro e deves ter muito cuidado a fazer uma programação php sem erros ou então podes passar horas a tentar descobrir por exemplo que não tinhas um simples ; (ponto e virgula) no sitio certo.

    Mas espero brevemente que seja feito um explorer para que esta detecção de erros seja mais facil. Actualmente uso zendAMF mas o amfPHP ainda não foi ultrapassado nesse ponto de deteção de erros server/language side.

    Cumps e abraços a todos.

  22. February 20, 2009 às 3:28 pm | Permalink

    Mário, obrigado pela dica. Vou ler.

  23. February 23, 2009 às 7:23 pm | Permalink

    Olá Mário, essa parte eu já dominei, inclusive juntei o Flex + Lumine + ZendAMF, tudo certinho, agora estou esperando a parte do mapeamento rsssss. tentei a documentação mas lá explica muito pouco, não sei se é pq é simples mesmo, mas estou um pouco perdido nas estruturas das pastas, vc sabe se é como no AMFPHP, manter a mesma estrutura nos dois lados?

  24. February 25, 2009 às 8:03 am | Permalink

    Luis Carlos, o mapeamento é muito simples mesmo, não necessita de qualquer estrutura de pastas, nem no flex, nem no php, pode usar directo:

    $server->setClassMap(“VOUser”, “VOUser”);

    e no flex meter o RemoteClass alias apenas como VOUser

    [RemoteClass(alias="VOUser")]

    Não necessita de caminhos, nem de estruturas de pastas iguais nem no flex nem no php, aqui é que as coisas simplificaram muito!

    no php pode ser meus.vos.VOUser e no flex pode ser meus.remote.alias.users.VOUser :)

    cumps.

    é tão simples como isso, a documentação ainda está fraca, mas também é por ser simples mesmo! :)

  25. February 25, 2009 às 7:28 pm | Permalink

    vou perturbar vc mais um pouquinho, e no caso eu usando o
    $server->setClassMap(”VOUser”, “VOUser”);

    preciso ter o $_explicitType na classe VOUser do PHP?

    e o $server->setClassMap() eu coloco no meu gateway, onde eu seto as classes, tipo assim:

    $server = new Zend_Amf_Server();
    $server->setClassMap(‘LinksVO’, ‘LinksVO’);
    $server->setClass(‘Link’);

    echo $server->handle();

  26. February 26, 2009 às 2:43 am | Permalink

    Finalmente consegui mapear… usando o PHP, Lumine e Flex ufa!!!!!

  27. March 4, 2009 às 12:54 am | Permalink

    Mario… lá no nosso arquvo services_config.xml… onde eu mudo para ao invés do meu arquivo ser INDEX.PHP digamos que eu mude para INDEX_ZEND.PHP.

    Pois como vou usar um site junto com o FLEX… preciso usar o INDEX.PHP para colocar o SWF do meu site.

    Thanks…

  28. March 4, 2009 às 7:16 am | Permalink

    basta mudares:
    endpoint uri=”http://localhost/flex/testZend/”
    para:
    endpoint uri=”http://localhost/flex/testZend/INDEX_ZEND.PHP”
    :)

  29. Gil
    April 28, 2009 às 3:00 pm | Permalink

    Obrigado pelo que vc tem feito para nos ajudar a entender muita coisa sobre o flex.
    Eu gostaria que vc mostrasse um emplo de GRUD com o zendAmf.
    Grato

  30. Marcio
    May 5, 2009 às 7:51 pm | Permalink

    Fiz exatamente como está descrito no exemplo. Funcionou no meu notebook, mas não funcinou no servidor de desenvolvimento. Estou rcebendo a mensagem abaixo, o que poderia ser? Grato.

    [FaultEvent fault=[RPC Fault faultString="Send failed" faultCode="Client.Error.MessageSend" faultDetail="Channel.Connect.Failed error NetConnection.Call.Failed: HTTP: Failed: url: 'http://localhost/flex/testZend/'"] messageId=”A1C1116E-97D1-8570-B10F-125338FD2CB6″ type=”fault” bubbles=false cancelable=true eventPhase=2]

  31. Douglas Ramalho
    May 20, 2009 às 1:11 pm | Permalink

    Quando tento acessar o site de outra máquina da rede, tenho como retorno o seguinte erro:

    [FaultEvent fault=[RPC Fault faultString="Send failed" faultCode="Client.Error.MessageSend" faultDetail="Channel.Security.Error error Error #2048 url: 'http://localhost/flex/testZend/'"] messageId=”0CC04575-75C6-3147-0940-5E216EC2A270″ type=”fault” bubbles=false cancelable=true eventPhase=2]

    O que pode ser?

  32. May 25, 2009 às 10:03 am | Permalink

    Marcio, no servidor de desenvolvimento deve antes de tudo alterar o services-config.xml colocando o seu endpoint uri=”enderecodosite.com/zendAmf/gateway.php” onde deve indicar as suas definições, depois compile de novo o projecto no flex e agora sim ele está pronto para colocar online.

    Douglas, o mesmo erro:
    Deve colocar no gateway o endereço da maquida de destino:
    url: ‘http://localhost/flex/testZend/’ -> Deve colocar sempre no services-config o endereço da maquina, como o projecto está compilado para o localhost em cada maquina que abrir o projecto ele vai estar procurando na sua propria maquina a pasta flex, coisa que nao existe…

    Faça o emso processo que indiquei em cima.
    Abraços.

  33. Loureiro
    June 4, 2009 às 5:12 pm | Permalink

    Mário,

    Eu baixei os arquivos do seu blog, mudei o services-config e mesmo assim tenho o seguinte erro:
    [FaultEvent fault=[RPC Fault faultString="Send failed" faultCode="Client.Error.MessageSend" faultDetail="Channel.Connect.Failed error NetConnection.Call.Failed: HTTP: Status 405: url: 'http://localhost/FlexProjects/testZend/'"] messageId=”99A620B3-3E91-F824-B763-AC396C87EA6C” type=”fault” bubbles=false cancelable=true eventPhase=2]

    Pode me ajudar?

    Obrigado!

  34. June 5, 2009 às 6:33 am | Permalink

    você consegue aceder ao index.php na sua pasta http://localhost/FlexProjects/testZend/index.php ??
    Veja se consegue e se dá algum erro…

    Abraço.

  35. Loureiro
    June 5, 2009 às 11:56 am | Permalink

    Quando chamo no browser a URL http://localhost/FlexProjects/testZend/index.php, ele entende que é um arquivo para download.

    Grato

  36. June 5, 2009 às 11:59 am | Permalink

    Isso quer dizer ou que o seu .php está mal escrito, ou que o servidor web não está a “entender” os ficheiros php e por isso não os processa…

    Verifique o seu php, e veja se o seu servidor abre um qualquer outro ficheiro php… cumps.

  37. Loureiro
    June 5, 2009 às 12:45 pm | Permalink

    Mário,

    Eu coloquei o phpinfo na mesma pasta do projeto e funcionou normalmente. Existe alguma alteração que eu tenha que fazer no php.ini para funcionar?

    Abraço

  38. Loureiro
    June 5, 2009 às 4:43 pm | Permalink

    Mário,

    Eu reescrevi o código e quando chamo a URL pelo browser printa “Zend Amf Endpoint
    “, contudo ainda recebo uma mensagem de erro:

    [FaultEvent fault=[RPC Fault faultString="Send failed" faultCode="Client.Error.MessageSend" faultDetail="Channel.Security.Error error Error #2048 url: 'http://localhost/FlexProjects/testZend/'"] messageId=”416C1C4E-C1D7-359C-F892-B14D25696A7C” type=”fault” bubbles=false cancelable=true eventPhase=2]

    Obrigado!

  39. Loureiro
    June 8, 2009 às 7:56 pm | Permalink

    Mário,

    Eu percebi que, quando eu chamo o projeto pelo endereço físico, funciona; porém, se chamo pela url o Flex me retorna o erro acima.

    Você saberia me dizer onde eu acerto isso?

    Grato mais uma vez,
    Loureiro

  40. July 4, 2009 às 3:34 am | Permalink

    Você vai abordar questões como CRUD utilizando o ZendAMF?

  41. July 5, 2009 às 8:56 am | Permalink

    Oi Flávio, sim… futuramente tenciono falar um pouco de operações CRUD com o ZendAMF.

    Abraço.

  42. Mauricio B. De Biasi
    July 20, 2009 às 3:12 pm | Permalink

    Sr(a), quando executo a index.php ele me apresenta a seguinte menssagem:

    Warning: require_once(Zend/Loader/PluginLoader.php) [function.require-once]: failed to open stream: No such file or directory in C:\wamp\www\flex\testZend\Zend\Amf\Server.php on line 40

    Fatal error: require_once() [function.require]: Failed opening required ‘Zend/Loader/PluginLoader.php’ (include_path=’.;C:\php5\pear’) in C:\wamp\www\flex\testZend\Zend\Amf\Server.php on line 40

    Alguem pode me dizer o por que ?

  43. Renyer
    July 21, 2009 às 11:10 am | Permalink

    Rsssssss, tentei fazer seu exemplo, mas n consegui, deu um erro que n tem nada haver no meu php la no require_once “Zend/Amf/Server.php”;

    quando achama essa função:

    /** Zend_Loader_PluginLoader */
    require_once ‘Zend/Loader/PluginLoader.php’;

    realmente eu olhei e n existe essa pasta Loader/

    mas existe um arquivo chamado loader.php

    e tmb n existe o require_once ‘Zend/Auth.php’;

    rssssssss, Melhor desistir de aprender Flex, primeiro exemplo e ja uma brinca dessas, rsssssss

    Bom mas no mas, muito bom o BLOG – Parabens

  44. Renyer
    July 21, 2009 às 11:14 am | Permalink

    Mauricio B. De Biasi

    Mesmo erro que o meu, rssssssssss, vamos resolver isso juntos, creio quebaixamos uma versão do ZEND diferente que n vem com esses arquivos…

    vamos esperra uma resposta dos experts

  45. Mauricio B. De Biasi
    July 22, 2009 às 1:00 pm | Permalink

    Renyer, é verdade, pelo que estava vendo o Mário criou esse tutorial baseado no ZendAMF 1.7.3 e estamos ja na versão 1.9 tente realizar o tutorial com a versão de exemplo (1.7.3) e deu o mesmo erro… rsrs

    Mario tem algo a acrecentar ?

  46. Flávio
    July 25, 2009 às 4:33 am | Permalink

    Eu tentei mas não deu. Eu já fui ver o código PHP para ver se tinha erro e nada, até no index.php chamei a função para recuperar dados e funcionou. O service-config.xml támbém funcionou, fui ver no Firefox 3.5 pelo Firebug e ele diz que a página retornou o código 301 ‘Movida permanentemente’

    Dá esse erro:
    [FaultEvent fault=[RPC Fault faultString="Send failed" faultCode="Client.Error.MessageSend" faultDetail="Channel.Connect.Failed error NetConnection.Call.BadVersion: : url: 'http://localhost/ZendAmf/app'"] messageId=”570C458E-D9FC-9BC9-E2B4-B02C6222772B” type=”fault” bubbles=false cancelable=true eventPhase=2]

  47. Flávio
    July 25, 2009 às 4:43 am | Permalink

    Problema resolvido, no ‘gateway’ deveria ser colocado index.php e não só o endereço. =D

  48. Renyer
    July 28, 2009 às 5:23 am | Permalink

    Mauricio B. De Biasi, blz?

    E ai conseguiu resolver o problema por ai? Creio que o Mario deve estar muito oculpado pra poder nos auxiliar, vo voltar a pegar nesse tutorial essa semana, to meio corrido aqui, mas dessa semana não passa, qualquer coisa eu posto aqui o resultado, abraço…

  49. Mauricio B. De Biasi
    July 28, 2009 às 12:37 pm | Permalink

    Flavio, bom dia, Qual vs vc usou do ZendAMF ? quando vc fala em ‘gateway’ vc esta falando do XML ? pois me parece que o ZendAMF não tem gateway….

    Abs

  50. Mauricio B. De Biasi
    July 28, 2009 às 1:07 pm | Permalink

    Coloquei no xml: endpoint uri=”http://localhost/flex/testZend/index.php” e tbm não funcionou ultilizei a vs 1.7.3 do zendAMF e continuo com o mesmo erro :

    ————————————–
    [FaultEvent fault=[RPC Fault faultString="Send failed" faultCode="Client.Error.MessageSend" faultDetail="Channel.Connect.Failed error NetConnection.Call.BadVersion: : url: 'http://localhost/flex/testZend/index.php'"] messageId=”01999CE1-0E64-5C03-2879-C178DF6E6461″ type=”fault” bubbles=false cancelable=true eventPhase=2]
    ——————————————————————

  51. Renyer
    July 28, 2009 às 2:38 pm | Permalink

    Pessoal, me tirem uma duvida estou tentando colocar esse tuto ai pra rodar, mas nada ate agora…

    Bom a duvida é o seguinte;

    meus ficheiros de .PHP

    não fecham a tag

    estão todos assim;

    <?php

    será isso que n esta funcionando?
    o arquivo que vcs baixaram estão da mesma forma?

    o coisa dificil…

  52. Mauricio B. De Biasi
    August 3, 2009 às 1:00 pm | Permalink

    Renyer,

    Que eu saiba as tag de inicio e fim são obrigatorias:
    Ex:

    Com relação ao ZendAMF não tive sucesso ate agora…

    Abs
    Mauricio

  53. Thiago
    August 3, 2009 às 8:15 pm | Permalink

    Opa,

    eu estava com o mesmo problema que o Reyner
    “Fatal error: require_once() [function.require]: Failed opening required ‘Zend/Loader/PluginLoader.php’ “,
    mas parece que no arquivo baixado no site da Zend na versão 1.9 não tem esses arquivos, daí eu baixei o zend_framework e copiei os arquivos que estavam faltando e colei na pasta que está o zendamf.
    Não sei se é a solução correta, mas funcionou

    Abs

  54. Rafael
    August 28, 2009 às 2:34 am | Permalink

    Olá pessoal!
    não sei se todos conseguiram revolver o problema em relação ao erro que estava acontecendo ao tentar acessar o arquivo index.php mas a solução é baixar o zend framework e não o zend amf, pelo menos foi fazendo essa alteração que começou a funcionar corretamente. O endereço seria o seguinte:
    http://framework.zend.com/download/latest
    no final tem o link para poder baixar, eu baixei a versão 1.9.2 e tá ok.

    Abraço.

  55. October 28, 2009 às 7:02 pm | Permalink

    Parabéns pelo post. Excelente didática. Fiz aqui e, deu certinho!!!

  56. Fernando
    November 24, 2009 às 3:01 pm | Permalink

    Yo tengo dos domain, uno .com y otro .com.ar. Si compilo para .com y entro por .com.ar obtengo un 2048, al igual que vi comentado. Como hago para que funcione tanto para .com como para .com.ar?

    I have 2 domains, one .com and another .com.ar. If I compile the app with an endpont with .com, I cannot access through .com.ar. Does anyone know a solution to this?

    Thanks in advance

  57. Ronaldo
    November 29, 2009 às 4:40 pm | Permalink

    Muito boa introdução ao Zend AMF!
    Tenho utilizado amfphp mas o Zend AMF já suporta php5 e tem um futuro promissor com a parceria Adobe-Zend, por isso a escolha é fácil.
    No amfphp o service browser ajuda rapidamente a testar o php do servidor, espero que o zend amf venha a ter essa funcionalidade.

    Abraço

  58. Nelson
    December 28, 2009 às 3:57 am | Permalink

    uso wamp php 5.3 – ZendAMF ultima versao – 27/12/09
    Quando acesso o index.php “http://localhost/flex/testZend/index.php” resulta no seguinte erro:
    Warning: require_once(Zend/Loader/PluginLoader.php) [function.require-once]: failed to open stream: No such file or directory in C:\wamp\www\flex\testZend\Zend\Amf\Server.php on line 41

    Fatal error: require_once() [function.require]: Failed opening required ‘Zend/Loader/PluginLoader.php’ (include_path=’.;C:\php5\pear’) in C:\wamp\www\flex\testZend\Zend\Amf\Server.php on line 41

    Quando peço para executar usando o FLEX resulta no seguinte erro:
    [FaultEvent fault=[RPC Fault faultString="Send failed" faultCode="Client.Error.MessageSend" faultDetail="Channel.Connect.Failed error NetConnection.Call.BadVersion: : url: 'http://localhost/flex/testZend/'"] messageId=”6E923904-1B04-C4A3-217D-D33435F00CE8″ type=”fault” bubbles=false cancelable=true eventPhase=2]

    Já refiz varias vezes e acabo chegando no mesmo erro,
    vc tem alguma ideia do que pode ser

3 Trackbacks

  1. Por links for 2009-02-02 « Minesa IT em February 2, 2009 às 8:01 pm

    [...] ZendAMF – Novidade, analise (vs amfPHP) e tutorial | TSW – That Should Work (tags: php mysql flex zend zend_framework) [...]

  2. [...] Para acessar o tutorial clique aqui. [...]

  3. [...] do meu post ZendAMF – Novidade, analise (vs amfPHP) e tutorial e depois de mer finalmente terminado a migração completa de um CRM/ERP de [...]

Deixe um comentário

O seu email nunca será publicado ou partilhado. Campos obrigatórios estão marcados com um *

*
*

Spam Protection by WP-SpamFree