domingo, 4 de março de 2012

WebService com Zend Framework

Depois de mais de um mês sem escrever nada no blog olha eu aqui de novo!
Hoje vou falar de algo que HOJE é pouco documentado, pouco explicado e MUITO utilizado, vou falar sobre como utilizar web service no ZEND FRAMEWORK, nesse caso SOAP.


Mas O PV me explica ai, o que é um web service? E esse tal de SOAP?

Se você não conhece e preferiu questionar eu fico muito feliz pois a dúvida é o principio da sabedoria e precisamos questionar para aprender. Afinal, ninguém nasceu sabendo.

Um web service é uma maneira de uma aplicação comunicar com um servidor Web. Tradicionalmente, quem interage com um servidor web é um ser humano, através de um browser. Se trocarmos o ser humano por uma aplicação, a interacção passa a ser por webservices.

Podem-se implementar webservices de várias maneiras. Duas delas ganharam notoriedade, por diferentes razões: SOAP e REST

SOAP(que é a que vou explicar aqui nesse artigo) é pegar numa mensagem xml, metê-la num envelope e enviá-la por HTTP (embora o SOAP permita diferentes protocolos de transporte, na prática é HTTP). A resposta vem igualmente num envelope, em xml. 

REST é usar o HTTP como ele foi concebido, com GET, POST, PUT e DELETE (estes últimos dois quase não são utilizados mas estão na especificação desde o início). Ou seja, se sabem fazer submit de forms, sabem usar REST. A diferença é que o submit de um form devolve uma página em html, e um webservice REST devolve uma página em Xml

Acho que nem preciso falar qual é o mais seguro não é? Por isso é nele que vamos "MARTELAR".

Ta legal, e como implementar isso no ZEND FRAMEWORK?

Vou utilizar como exemplo aquele Quick Start que a zend disponibiliza em seu site então faça um download la mesmo blz? 

Ele já vem com 3 controllers configurados ok? Index, Error e GuestbookController... vamos apenas utilizar o IndexController pois é ai que vamos escrever nosso webservice cliente(aquele que consome) e o server(aquele que libera).



  1. <?php
  2.   /* Carregando a classe que nosso server vai consumir */
  3. require_once realpath(APPLICATION_PATH .'/../library/').'/Calculadora.php';
  4. class IndexController extends Zend_Controller_Action {
  5.     public function init() {
  6.         /* Initialize action controller here */
  7.     }
  8.     public function indexAction() {
  9.     }
  10.     public function soapserverAction() {
  11.         if (isset($_GET['wsdl'])) {
  12.             /*
  13.              * Usar o Soap AutoDiscover para criacao do WSDL de forma dinamica
  14.              */
  15.             $autodiscover = new Zend_Soap_AutoDiscover();
  16.             $autodiscover->setClass('Calculadora');
  17.             $autodiscover->handle();
  18.         } else {
  19.             // Disponibilizar o webservice atraves do canal:
  20.             $soap = new Zend_Soap_Server("http://start.local/index/soapserver?wsdl");
  21.             $soap->setClass('Calculadora');
  22.             $soap->handle();
  23.         }
  24.         exit;
  25.     }
  26.     public function soapclienteAction() {
  27.         /* canal de chamada para webservice */
  28.         $soap = new Zend_Soap_Client("http://start.local/index/soapserver?wsdl");
  29.         echo $soap->soma(11, 2) . PHP_EOL; // imprime 3
  30.         echo $soap->subtrai(11, 2) . PHP_EOL; //imprime 9
  31.        
  32.         exit;
  33.     }
  34. }


Agora a classe "Calculadora que nosso webservice irá consumir


  1. <?php 
    /
    *
  2.  * Classe calculadora
  3.  */
  4. class Calculadora {
  5.     /**
  6.      * Realiza Soma
  7.      * @param integer $a
  8.      * @param integer $b
  9.      * @return integer
  10.      */
  11.     public function soma($a, $b) {
  12.         return $a + $b;
  13.     }
  14.     /**
  15.      * Realiza Subtracao
  16.      * @param integer $a
  17.      * @param integer $b
  18.      * @return integer
  19.      */
  20.     public function subtrai($a, $b) {
  21.         return $a - $b;
  22.     }
  23.     /**
  24.      * Concatena
  25.      * @param string $a
  26.      * @param string $b
  27.      * @return string
  28.      */
  29.     public function concatena($a, $b) {
  30.         return $a ." concatenado com". $b;
  31.     }
  32. }


Veja que no indexcontroller criamos a action soapcliente soapserver isso pq é um teste então o cliente e o servidor vão estar no mesmo lugar. O WSDL que vamos carregar é o do link do nosso servidor: http://start.local/index/soapserver?wsdl (onde start.local vc substitue pelo link do seu localhost e/ou site em que isso irá rodar).

Para testar vc acessa o seu WSDL  http://start.local/index/soapserver?wsdl e se ele retornar um XML é com a descrição da sua classe Calculadora ele esta pronto para ser utilizado então para isso esse a action cliente e faça o teste: http://start.local/index/soapcliente

Para finalizar vou explicar o que é esse carinha ai WSDL que significa Web Services Description Language e é uma linguagem baseada em XML utilizada para descrever Web Services funcionando como um contrato do serviço. Trata-se de um documento escrito em XML que além de descrever o serviço, especifica como acessá-lo e quais as operações ou métodos disponíveis.

Imagine que são as regras para trabalhar com o webservice e como assim qualquer desenvolvedor de qualquer tecnologia consegue trabalhar com isso.


Vou disponibilizar um webservice SERVER na WEB para testes o WSDL será:
http://www.profpv.com/index/soapserver?wsdl

Assim todo mundo pode testar, inclusive o método que trabalha com STRING. 
Valeu e até a próxima


quarta-feira, 15 de fevereiro de 2012

Sincronizando estrutura de banco no doctrine

Rápido demais....

Abra o console
Acesse sua aplicação (Cd /var/www/suaapp)
E execute o comando: ./scripts/doctrine orm:schema-tool:update --force


Pronto, sincronizado.

quarta-feira, 18 de janeiro de 2012

UML - Diagrama de Sequência

Pensaram que eu iria parar com a sequencia de artigos sobre UML não é campeões? Posso achar um saco UML mas eu vou terminar sim com esses artigos, hoje vamos falar do Diagrama de Sequência que particularmente é um dos melhores(ou menos piores) da UML! Apenas para refrescar sua memória, a UML é dividida basicamente em 2 tipos de diagramas os de estrutura (Diagrama de classe...etc..) e os de comportamento (diagrama de atividade...etc..) e onde vc acha que e o de sequencia esta acoplado? (R: Comportamento claro)





Antes de explicar técnicamente eu vou dar uma resumida; O diagrama de sequencia tem como objetivo exibir o comportamento dos métodos baseado em uma ação. Ta mas que ação? Vamos imaginar uma consulta de funcionário em um determinado sistema. Veja:

Explicando:  Vejo que nesse diagrama de sequencia temos um ATOR, uma Camada de Apresentação (View), Camada de Negócio (Uma camada para a regra de negócio, controller por exemplo) e uma camada de persistência no banco(ORM).
E divido assim em camada podemos mostrar a sequencia no comportamento delas quando existe a consulta de um funcionário.


IMPORTANTE: O diagrama de sequencia não existe um padrão de nomes, nesse caso utilizamos camada mas vc poderia nomear com as classes por exemplo "consulta.html , consultaNegocio , Banco" isso depende da sua necessidade.

 

Explicação formal

Este diagrama procura determinar a sequência de eventos que ocorrem em um determinado processo, ou seja, quais condições devem ser satisfeitas e quais métodos devem ser disparados entre os objetos envolvidos e em que ordem durante um processo específico. Assim, determinar a ordem em que os eventos ocorrem, e as mensagens que são enviadas, os métodos que são chamados e como os objetos interagem entre si dentro de um determinado processo é o objetivo principal deste diagrama. Pensando de uma forma mais clara seu objetivo é entender a sequencia em que os métodos se comportam baseado em uma ação. Mas quem define essa ação?

O Diagrama de Sequência baseia-se no Diagrama de Casos de Uso. No entanto deve-se ter em mente que o fato de haver normalmente um único Diagrama de Casos de Uso não significa em absoluto que deva haver um único Diagrama de Sequencia. Normalmente existem diversos Diagramas de Sequência em um projeto, um para cada processo específico do sistema ou seja, talvez exista um uma parte, módulo, componente do sistema que tem apenas um caso de uso principal, um diagrama de caso de uso e ‘n’ de sequencia pois a tendencia é realmente o de atividade e o de sequência possuierem um pouco mais diagramas. Mas claro que isso não é regra e cada caso é um caso mas se você sempre estiver fazendo um diagrama de sequencia de um componente grande eu recomendo que vc pare, pense e veja quais ações estão faltando.





Um Diagrama de Sequência na maioria das vezes se identifica com um Caso de Uso específico, porque um Caso de Uso, em geral, refere-se a um processo disparado por um usário. Assim um Diagrama de Sequência também também permite documentar um Caso de Uso. Na verdade, muitas ferramentas CASE permitem gerar um Diagrama de Sequencia diretamente a partir de um Caso de Uso.

Nem sempre um Caso de Uso gera um Diagrama de Sequência, como é, muitas vezes, o que ocorre com os Casos de Uso do tipo <<include>>, porque este têm que ser executados juntamente com outros Casos de Uso que os utilizam e, por isso muitas vezes suas etapas são descritas nos diagramas de Sequência relativos aos Casos de Uso que os Utilizam. Porém nada impede que se defina um Diagrama de Sequência exclusivo para um Caso de Uso utilizado por outros Casos de Uso através da associação <<include>>.
Obviamente, o Diagrama de Sequência depende também do Diagrama de Classes,

Os atores são os mesmos descritos no Diagrama de Casos de Uso, ou seja entidades externas que geram ações e disparam eventos.

Os atores não são obrigatórios no diagrama de sequencia mas são utilizados frequentemente

Objetos representam as instâncias das classes envolvidas no processo ilustrado pelo Diagrama de Sequencia. Os objetos são apresentados como retângulos contendo um texto que identifica primeiramente o nome do objeto, em minúsculo, e depois o nome da classe, com as letras iniciais maiúsculas, a qual o objeto pertence. Essas duas informações são separadas por um simbolo de (:) dois pontos. Veja um exemplo de objeto:

 
Veja como exemplo nessa figura um exemplo de objeto onde Paulo é o nome do objeto seguido de Pessoa que é a classe pessoa, ou seja, Paulo é uma instância da classe Pessoa.

Abaixo do retangulo existe uma linhda pontilhada e ela representa o tempo de vida o objeto, olhando dessa maneira não existe uma forma de medir um tempo de vida real nele isso só será possível quando o diagrama completo estiver pronto.

A e tem outra coisa, não existe diagrama que veja o tempo em horas/minutos/segundos de um objeto não ta? Quando digo linha do tempo me refiro a linha da vida, ao tempo que ele vai estar vivo durante um processo.


Um objeto pode existir desde o início do processo ou ser criado durante o decorrer da execução do mesmo.

Mensagens
As ,mensagens são utilizadas no Diagrama de Sequencia para demonstrar a ocorrência de eventos, que normalmente forçam a chamada de um método em algum dos objetos envolvidos no processo. Veja um exemplo:



A mensagem investimento entra no controller JAVoiceController e ele executa seu método vote().


Veja um exemplo completo de um diagrama de sequência para aluguel de carro:



Bem, por hoje é só. Espero ter ajudado e se não acharam que ficou claro me avisem.
Obrigado!