terça-feira, 10 de abril de 2012

Formularios no zend framework


Vamos limpar nossa mente para a imaginação...
Como seria bom reaproveitar um formulario de forma que eu pudesse definir destinos diferentes ou ainda inserir um ou dois campos a mais... uma validação lógica e evitar scripts como SQL injection sem ter muito trabalho... deve ser um sonho... não sei...

Será que isso é possível? (Não vamos evangelizar o ZF mas...) Com o Zend Framework MUITA coisa é possível sem precisar "escovar bits"...e por isso hoje vou falar sobre Zend_Form ensinando a criar formularios completos sem muito trabalho e ainda reutilizando eles.

A verdade é que quando eu comecei a trabalhar com o ZF eu não gostava muito do Zend_Form e sempre achei melhor utilizar formularios escritos direto na view... Tolice a minha pois ficar escrevendo formularios e formularios só serviu para me dar trabalho(PENA =[ ), mas é fazendo "merda" que vamos aprendando não é? 

Só não faça merda com o sistema de um cliente... faça isso com suas experiências é melhor e mais seguro.

Quando vc baixa o Quickstart do zend framework por padrão ele já te da um diretório com o nome forms e vem até um exemplo de formulario com instancias de outras classes do zend, mas acredito que para um iniciante a curva de aprendizagem é longa quando ve uma classe pronta com tanta coisa... por conta disso vamos criar uma nova.

Nesse diretorio forms crie um arquivo chamado Exemplo.php e nele insira esse conteudo:

  1. <?php
  2. class Application_Form_Exemplo extends Zend_Form {
  3.     public function init() {
  4.         $titulo = new Zend_Dojo_Form_Element_ValidationTextBox('titulo');
  5.         $titulo->setLabel('titulo')
  6.                  ->setRequired(true)
  7.                 ->setRegExp("[\w\d]*");        
  8.         $submit = new Zend_Dojo_Form_Element_SubmitButton('Enviar');
  9.         $this->addElements(array($titulo, $submit));
  10.     }
  11. }
  12. ?>


O que fizemos ai foi simples, criamos uma classe Exemplo mas o nome dela foi dado de acordo com o diretório (Application/Forms/Exemplo) justamente para o ZF carrega-la sem precisar de malditos includes e essa classe extende da Zend_Form que tem diversos métodos para formulario.

Criamos um método init que é o construtor dessa classe e nele inserimos um input titulocom alguns métodos que definem label, obrigatoriedade e expressão regular respectivamente.

Criamos o objeto $submit passando seu nome para o construtor da classe SubmitButton e por fim adicionamos esses caras no formulario completo.

Mas e como eu faço para colocar isso na view?

Esse trabalho é bem simples... vá para o seu controller index na action index que é onde vamos chamar esse carinha e fica bem simples olha:

  1.      public function indexAction() {
  2.         $formulario = new Application_Form_Modelo();
  3.         $formulario->setAction('index/teste');
  4.         $this->view->formulario = $formulario;
  5.     }
Veja que nesse action fizemos algo muito simples, criamos um objeto $formulario que é instancia da classe que criamos(do nosso formulario) e setamos um local para onder esse form será enviado e por fim mandamos ele para a view...

E ai na view é só exibir essa criança (echo $this->formulario;) pronto, formulario pronto e podemos reutiliza-lo em qualquer lugar, podendo mudar o destino e ainda adicionar elementos, validações e etc...

Não entrei a fundo sobre as validações, formatação do formulario pois a ideia era mostrar de forma simples como ele funciona caso vc queira um estudo aprofundado nesses caras a documentação do zend esta mt boa ou ainda veja nesse blog onde o autor fala mt bem dos decorators do zend form: blog 

Bem pessoal por hoje é só.... valeu!



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.