AMFPHP/ Flex/ Flex 4

Flex 4 com PHP – Primeira Parte

O framework Flex tem uma limitação, ele não comunica-se diretamente com coleções de dados e para isso você precisa de uma linguagem de back-end como php, coldfusion,python, Java, etc para comunicar e trocar dados entre o banco e o lado cliente(flex).

Tem gente que acha isso super complicado, por que envolve uma série de fatores como, configuração, mapeamento, conhecimento da API e tradutores. Na verdade todos são ingredientes chaves para você colocar seu aplicativo Flex em contato com o mundo exterior dos bancos de dados.

A configuração que me refiro é o famoso arquivos services-config.xml onde você vai mapear tudo que for preciso de canais, channels para que os dados trafeguem entre o Flex, php, tradutor e banco de dados em um processo assincrono.
Essa configuração de uma certa forma ajuda a encaixar os dados em um trilho, só que você vai precisar mapear os objetos para deixar tudo bonito e nos conformes como assim voce costuma fazer, deixar organizado a budega.
A api para fazer isso é tudo muito simples, basta você saber usar o RemoteObject,ResultEvent,FaultEvent e o resto é lenda.
Já a parte do tradutores, é que nem você viajar para rússia e tentar falar português por lá. Dificilmente você será entendido, há não ser que você seja muito bom em mimica.
É que funciona assim, os VO (Value Object) do Actionscript 3.0 são tipados, ou seja você tem diferentes tipos de variáveis, sejam elas, string, inteiros ou próprias, e no PHP isso não existe, essa tal de tipação só existe no caso de tipação própria e mesmo assim ainda é virtual e não real, como manda o protocolo.
Com isso você precisa que um tradutor faça o trabalho sujo para você viver o sonho americano da comunicação funcionar perfeitamente e os VO tanto do Actionscript 3.0 quanto do PHP conversem entre sí de modo fácil.
Existem diversos no mercado como o famoso Zend_AMF,AMFPHP,Weborb for PHP ,etc . Cada um tem uma particularidade. Usaremos o mais comum em projetos que é o AMFPHP e por se tratar de ser gratis. Eu sei que você gosta de coisa grátis?!


Então como posso fazer um exemplo prático disso? Imaginemos um cadastro de Cliente.

Primeiramente, você tem que ter o Flash Builder instalado, se não tiver, baixa lá do site da Adobe.

Segundamente, você tem que baixar o XAMPP, um gerenciador com TUDO já integrado, php,mysql,apache.

Em terceiro lugar, baixe o nosso amigo AMFPHP.

Com o Flash Builder instalado e o XAMPP rodando de vento em poupa, hora de começar a programar.

Crie um projeto novo no Flex, dê-lhe um nome que seja fácil para você, no meu caso eu coloquei Clientes, veja como está o meu na figura abaixo.

newproject_php

Próximo passo é setar o diretório onde o seu servidor de php está funcionando, geralmente a instalação padrão do XAMPP é sempre na raiz C:/xampp/, veja como está o meu, depois que você inserir, por favor não esqueça de clicar na opção “Validar”, muito importante para dar continuidade.

newproject_path

Okay, estamos quase lá com nosso projeto criado, configurado, agora falta o último passo para quando você clicar em “Run” no Flash Builder ele possa já abrir no navegador e no path correto.
Como na figura abaixo, mude a opção output URL para a URL do caminho do seu projeto, veja como está.
newproject_url

Passados a fase de configuração do lado Flex, vamos configurar a parte do PHP agora para funcionar conforme a banda toca. Lembra do AMFPHP que você baixou? descompacte ele dentro do diretório “clientes” lá no seu apache server.

diretorio_amfphp

Eu renomeei de amfphp1.9 para amfphp, para ficar fácil para mim. Então depois disso eu sabendo que o meu apache está rodando, vou até o navegador e digito a URL “http://localhost/clientes/amfphp/browser/”. Esse browser vai servir para gente escolher a opção de como o AMFPHP vai se comportar e qual tipo de mensagem ele irá se comportar, então nesse caso iremos usar a opção AMF 3. Clique em OK e veja como ficou o meu.

amf3

AMFPHP quase configurado, para tal, agora precisamos criar a pasta de serviços dele, esses serviços são os métodos que iremos usar para coletar dados e fazer o famoso CRUD de dados.

Então dentro do diretório do AMFPHP, navegue até C:/xampp/htdocs/clientes/amfphp/services. E nesse diretório você vai criar seus arquivos soltos “classes” ou você pode ser mais organizado e criar um diretório para deixar tudo no seu devido lugar. Eu preferi criar uma pasta chamada cliente-services.
Com isso pronto, agora começa a parte boa, criar as classes do PHP para consultar os dados.

Eu costumo criar os esqueletos das classes antes mesmo de definir no banco de dados, tem gente que faz primeiro o banco e depois as classes, cada um tem um jeito estranho de trabalhar, então você deve ter o seu, tente descobrir qual é o mais confortável para seu dia-a-dia.

Se você costuma criar logo o banco, então está aqui o esqueleto do banco.

-- ----------------------------
-- Table structure for `clientes`
-- ----------------------------
DROP TABLE IF EXISTS `clientes`;
CREATE TABLE `clientes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `cliente_nome` varchar(99) COLLATE utf8_latvian_ci NOT NULL,
  `cliente_tipo` char(3) COLLATE utf8_latvian_ci NOT NULL DEFAULT 'CPF',
  `cliente_cnpj` varchar(18) COLLATE utf8_latvian_ci DEFAULT NULL,
  `cliente_cpf` varchar(12) COLLATE utf8_latvian_ci NOT NULL,
  `cliente_endereco` varchar(99) COLLATE utf8_latvian_ci NOT NULL,
  `cliente_endereco_compl` varchar(19) COLLATE utf8_latvian_ci NOT NULL,
  `cliente_endereco_numero` tinyint(11) NOT NULL,
  `cliente_bairro` varchar(29) COLLATE utf8_latvian_ci NOT NULL,
  `cliente_cidade` varchar(29) COLLATE utf8_latvian_ci NOT NULL,
  `cliente_estado` varchar(29) COLLATE utf8_latvian_ci NOT NULL,
  `cliente_cep` varchar(9) COLLATE utf8_latvian_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_latvian_ci;

-- ----------------------------
-- Records of clientes
-- ----------------------------
INSERT INTO `clientes` VALUES ('1', 'Igor Costa', 'CPF', null, '0000000', 'Rua XXo,85', '', '11', 'Pequeno Alencar', 'Petrolina', 'PE', '56300000');

-- ----------------------------
-- Table structure for `pedidos`
-- ----------------------------
DROP TABLE IF EXISTS `pedidos`;
CREATE TABLE `pedidos` (
  `id_pedidos` int(11) NOT NULL AUTO_INCREMENT,
  `pedido_descricao` varchar(99) COLLATE utf8_latvian_ci DEFAULT NULL,
  `cliente_id` int(11) DEFAULT NULL,
  `data_pedido` date DEFAULT '2011-01-01',
  PRIMARY KEY (`id_pedidos`),
  KEY `cliente_pk` (`cliente_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_latvian_ci;

-- ----------------------------
-- Records of pedidos
-- ----------------------------


Basta copiar o código MySQL do banco e executar em qualquer cliente de MySQL que você possua, a idéia é ter um painel de clientes e pedidos, onde o cliente faz vários pedidos.

Voltando para o PHP, eu crio 2 classes principais, uma chamada ClienteServices e outra chamado PedidoServices.

Em cada um delas eu utilizo o seguinte esqueleto tanto para ClienteServices.php e PedidosServices.php.

NOTA: Nunca esqueça que o nome do arquivo .php precisa ser igual ao nome declarado na classe, caso contrário não vai funcionar.

Arquivo : ClienteServices.php


E para o arquivo PedidoServices.php


Perfeito, tendo isso em consideração eu passo a criar os VO da minha aplicação server, nesse casso os VOs(Value Objects), vão ficar no diretório que criei especificadamente para eles “vos”,óbvio não?
Como é um VO em PHP, é simples, basta fazer isso aqui que fiz abaixo.

Arquivo Cliente.php



Veja, eu tenho uma classe simples, que tem todas as propriedades da minha classe, só que tem um elemento extra que eu uso para mapear esse objeto no AMFPHP, essa variavel com o nome _explicitType serve justamente para isso. Existem várias maneiras de mapear os objetos e deixa-los tipados, eu uso a maneira mais simples possível, você deve procurar outras maneiras que deva encaixar em seu projeto.

Agora o outro arquivo o Pedido.php


Perfeito, esqueletos prontos, VOs prontas, agora falta fazer a coisa funcionar, eu criei um arquivo extra chamado conectar.inc onde eu coloco as informações do banco de dados e como acessa-lo.
Então aqui está meu arquivo conectar.inc, ele está salvo no mesmo diretório que os ClienteServices.php e PedidoServices.php estão.



Como usar agora o esqueleto do ClienteServices.php para consultar os dados, primeiro passo é adicionar as dependencias que temos, conectar.inc e a VO Cliente.php para executar todos os métodos, então eis que eu finalizei aqui esse exemplo abaixo.
Se houver outra maneira mais simples de fazer em PHP ou se você é expert em PHP, ajude a melhorar, minhas habilidades em PHP levaram a chegar nesse exemplo.

ClienteServices.php completo

nome = $row['cliente_nome'];
			$cliente->tipo = $row['cliente_tipo'];
			$cliente->cpf  = $row['cliente_cpf'];
			$cliente->cnpj = $row['cliente_cnpj'];
			$cliente->endereco = $row['cliente_endereco'];
			$cliente->endereco_complemento = $row['cliente_endereco_compl'];
			$cliente->endereco_numero = $row['cliente_endereco_numero'];
			$cliente->bairro = $row['cliente_bairro'];
			$cliente->cidade = $row['cliente_cidade'];
			$cliente->estado = $row['cliente_estado'];
			$cliente->cep = $row['cliente_cep'];

			array_push($resultado,$cliente);
		}
		return $resultado;
		$this->limpa_resultado($row);

	}
	public function novoCliente($cliente)
	{
		$cliente = new Cliente();

		$query = "INSERT INTO clientes (id,cliente_nome,cliente_tipo,cliente_cnpj,cliente_cpf," .
				"cliente_endereco,cliente_endereco_compl,cliente_endereco_numero,cliente_bairro," .
				"cliente_cidade,cliente_estado,cliente_cep) " .
				"VALUES ('','".$cliente->nome."','".$cliente->tipo."','".$cliente->cnpj."','".$cliente->cpf."','".$cliente->endereco."'," .
			"'".$cliente->endereco_complemento."','".$cliente->endereco_numero."','".$cliente->bairro."','".$cliente->cidade."'," .
								"'".$cliente->estado."','".$cliente->cep."')";


		$executa = mysql_query($query);
		if($executa)
		return true;
		else
		return false;
	}
	public function editarCliente($cliente,$id)
	{
		$query = "UPDATE clientes SET cliente_nome='".$cliente->nome."',cliente_tipo='".$cliente->tipo."',cliente_cnpj='".$cliente->cnpj."'," .
				"cliente_cpf='".$cliente->cpf."',cliente_endereco='".$cliente->endereco."',cliente_endereco_compl='".$cliente->endereco_complemento."'," .
						"cliente_endereco_numero='".$cliente->endereco_numero."',cliente_bairro='".$cliente->bairro."',cliente_cidade='".$cliente->cidade."'," .
								"cliente_estado='".$cliente->estado."',cliente_cep='".$cliente->cep."' WHERE id='".$id."'";

		$executa = mysql_query($query);
		return $executa;
	}
	public function deletarCliente($idCliente)
	{

		$query = "DELETE FROM clientes WHERE clientes.id=$idCliente";
		$executa = mysql_query($executa);
		return $executa;
	}
	private function limpa_resultado($consulta)
	{
		mysql_free_result($consulta);
	}
}
?>

E agora o arquivo Pedido.php completo.

pedido_descricao = $row['pedido_descricao'];
			$pedido->cliente_id = $row['cliente_id'];
			$pedido->data_pedido = $row['data'];
			array_push($resultado,$pedido);
		}
		return $resultado;
		$this->limpa_resultado($resposta);

	}
	public function novoPedido($pedido)
	{
		$pedido = new Pedido();

		$nova_data = date('d/m/Y');
		$query = "INSERT INTO pedidos (pedido_descricao,cliente_id,data) VALUES ('".$pedido->pedido_descricao."','".$pedido->cliente_id."',$nova_data) ";
		$executa = mysql_query($query);
		return $executa;
	}
	public function editarPedido($pedido)
	{
		$pedido = new Pedido();
		$query = "UPDATE pedidos SET pedido_descricao='".$pedido->pedido_descricao."'";
		$executa = mysql_query($query);

		return $executa;
	}
	public function deletarPedido($idPedido)
	{
		$query = "DELETE FROM pedidos WHERE id_pedidos = '".$idPedido."'";
		$executa = mysql_query($query);

		return $executa;

	}
	private function limpa_resultado($consulta)
	{
		mysql_free_result($consulta);
	}
}
?>

Uffa!, e ainda falta a parte do Flex, isso é assunto para a parte 2 desse tutorial.

13 thoughts on “Flex 4 com PHP – Primeira Parte

  1. Parabéns pelo post, excelente, muito clara sua explicação! Estou iniciando no FLASH BUILDER e estava mesmo precisando algo deste nível.
    Aguardo, ansioso, a segunda parte!

  2. Cara muito show seu post, salvou minha vida, mas quando estava ficando bom, acaba. Quando sai essa segunda parte??

  3. Muito bom Igor!
    Show de bola mesmo!
    Gostaria MUITO de saber como é a outra parte (do Flex).
    Você tem previsão para lançamento?

Deixe uma resposta para Will Cancelar resposta

O seu endereço de email não será publicado. Campos obrigatórios são marcados com *