iniciando-zf2

34
5/23/2018 iniciando-zf2-slidepdf.com http://slidepdf.com/reader/full/iniciando-zf2-561d4e60b8527 1/34 Iniciando com o Zend Framework 2 Elton Luís Minetto

description

A ideia deste livro é servir como um “primeiros passos” no mundo do Zend Framework 2. Nãovamos aqui nos aprofundar nas teorias ou formas mais complexas de construir projetos com o ZendFramework 2, mas vamos ver como criar um CRUD básico e conhecer alguns conceitos importantes.No último capítulo do livro vamos ver os próximos passos, para onde podemos partir depois desteprimeiro contato.Vamos começar?

Transcript of iniciando-zf2

  • Iniciando com o Zend Framework 2

    Elton Lus Minetto

  • Iniciando com o Zend Framework 2Elton Lus Minetto2014 Elton Lus Minetto

  • Contedo

    Introduo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1Instalando . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

    Requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2Instalando o framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

    Definindo o projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6Descrio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6Modelagem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6Criao das tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7Configurando o projeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

    Modelos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10Criando a entidade Post . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

    Controladores, rotas e vises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14Controladores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14Vises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15Layouts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17Rotas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19Desafio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

    Formulrios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22Prximos passos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

  • IntroduoA ideia deste livro servir como um primeiros passos no mundo do Zend Framework 2. Novamos aqui nos aprofundar nas teorias ou formas mais complexas de construir projetos com o ZendFramework 2, mas vamos ver como criar um CRUD bsico e conhecer alguns conceitos importantes.No ltimo captulo do livro vamos ver os prximos passos, para onde podemos partir depois desteprimeiro contato.Vamos comear?

  • InstalandoO processo de instalao do Zend Framework 2 foi um dos tpicos que teve maior avano desdeas verses anteriores. Ficou realmente muito mais fcil de instalar e atualizar o framework e suasdependncias.

    RequisitosPara criarmos um projeto usando o Zend Framework 2 precisamos atender os seguintes requisitos:

    Um servidor Web. O mais usado o Apache mas pode ser configurado usando outros comoo IIS ou o Nginx. Os exemplos desse livro consideram o uso do servidor Apache. O PHP,apartir da verso 5.4, possui um servidor web embutido, mas no considerei o uso dele nesselivro pois nem todos os ambientes de desenvolvimento esto atualizados para as verses maisrecentes da linguagem. No caso de usar o Apache necessrio que o mdulo mod_rewriteesteja habilitado. No arquivo de configurao basta adicionar as linhas abaixo, ou alter-laspara refletir o seguinte:

    1 LoadModule rewrite_module modules/mod_rewrite.so2 AddModule mod_rewrite.c3 AllowOverride all

    Um banco de dados. No algo obrigatrio mas no nosso caso iremos usar o banco MySQL.Claro que voc pode usar outro banco como o SQLite ou o PostgreSQL, mas os exemplos seroescritos para o MySQL.

    PHP 5.3.3 ou superior. Extenso intl do PHP. O framework usa esta extenso para formatar datas e nmeros. Estaextenso pode ser instalada usando-se o comando pecl do PHP.

    Caso esteja usandoWindows ouMacOSX estes requisitos podem ser facilmente cumpridos instalando-se um dos pacotes de desenvolvimento famosos como oXAMPP (Windows e MacOSX ) ou o MAMP(MacOSX), que possuem todos os pacotes j configurados.Usando-se Linux basta usar o sistema de gerenciamento de pacotes (apt-get, yum, etc) para instalaros pacotes necessrios.

  • Instalando 3

    Instalando o frameworkA forma mais recomendada de iniciar um projeto usar um dos esqueletos de aplicao que estodisponveis no Github. A documentao oficial do framework recomenda o uso do:https://github.com/zendframework/ZendSkeletonApplicationPara iniciarmos o nosso projeto vamos clonar o projeto usando o git. O primeiro passo acessarmosnosso diretrio de projetos. No meuMacOSX esse diretrio o /Users/eminetto/Documents/Projects/mas voc pode mud-lo para qualquer diretrio do seu sistema operacional.Vamos executar os comandos:

    1 cd /Users/eminetto/Documents/Projects/2 git clone https://github.com/zendframework/ZendSkeletonApplication.git iniciando-\3 zf2

    Isso vai criar um diretrio chamado iniciando-zf2 com o cdigo do esqueleto.Se voc no tiver o git instalado na sua mquina pode fazer o download e descompactar no diretrio.O download pode ser feito na url:https://github.com/zendframework/ZendSkeletonApplication/archive/master.zip

    Instalar dependncias com ComposerAo clonar (ou fazer o download) do esqueleto da aplicao ainda no temos o framework em si. Aforma mais rpida de termos o framework instalado usando a ferramenta Composer. O Composer uma ferramenta criada para instalar e atualizar dependncias de cdigo em projetos PHP. Paraentender em detalhes como funciona o Composer eu recomendo esse screencast e o site oficial daferramenta.Vamos usar o composer para instalar o framework:

    1 cd iniciando-zf22 php composer.phar self-update3 php composer.phar install

    O primeiro comando, o self-update no obrigatrio mas recomendado pois isso garante que oComposer est atualizado com a ltima verso estvel. Com o segundo comando o Composer far odownload do framework e todas as suas dependncias, bem como configurar um autoloader que oframework usar.Bem mais fcil e rpido do que as verses antigas, que pediam cadastro no site da Zend.

  • Instalando 4

    Configurar o Vhosts do ApacheUm hbito que eu tenho sempre que desenvolvo um novo projeto criar um servidor virtual naminha mquina para isolar o ambiente do projeto. Isso facilita bastante os testes, a organizao dosprojetos e atmesmo o deploy do aplicativo para o servidor de produo no final do desenvolvimento.Para isso vamos configurar um servidor virtual no Apache. No arquivo httpd.conf (ou apache.confou na configurao de servidores virtuais do seu sistema operacional) adicionar o seguinte:

    1 2 ServerName iniciando-zf2.dev3 DocumentRoot /Users/eminetto/Documents/Projects/iniciando-zf2/public4 SetEnv APPLICATION_ENV "development"5 SetEnv PROJECT_ROOT "/Users/eminetto/Documents/Projects/iniciando-zf2"6 7 DirectoryIndex index.php8 AllowOverride All9 Order allow,deny10 Allow from all11 12

    https://gist.github.com/eminetto/318b15ff2554a1db58cd necessrio alterar os caminhos nas opes DocumentRoot, PROJECT_ROOT e Directory pararefletirem o caminho correto em sua mquina. preciso tambm alterar o arquivo hosts do sistema operacional para adicionar o endereoiniciando-zf2.dev pois o mesmo no existe em nenhum DNS.No Linux e Mac OSX, alterar o /etc/hosts e adicionar a linha:

    1 127.0.0.1 iniciando-zf2.dev

    No Windows o arquivo que deve ser alterado o c:\windows\system32\drivers\etc\hosts e a linha aser adicionada igual a citada acima.Podemos agora fazer um teste para verificar se o nosso esqueleto de projeto est funcionandoacessando o endereo: http://iniciando-zf2.dev em algum navegador. A tela esperada mostradaabaixo.

  • Instalando 5

    Welcome

    Esta a tela de boas vindas do Zend Framework 2. Caso esta tela no esteja aparecendo recomendorever os passos acima e tambm verificar os logs doApache para identificar o que pode ter acontecidode errado.Com esses passos temos um ambiente instalado e podemos iniciar o planejamento do nosso primeiroprojeto usando o Zend Framework 2.

  • Definindo o projetoDescrioNa minha opinio a melhor forma de aprender uma nova ferramenta, linguagem ou sistemaoperacional quando voc realmente precisa resolver algum problema com ela. Pensando nisso,esse livro baseado na construo de um aplicativo: um blog.Mas um blog? Por alguns motivos:

    um problema fcil de se entender. Todo mundo sabe como um blog funciona, seus requisitose funcionalidades, ento a fase de requisitos do projeto fcil de completar.

    Um blog apresenta um grande nmero de funcionalidades comuns a vrios outros sites, comomdulos, controle de acesso e permisses, upload de arquivos, tratamento de formulrios,cache, tradues, integrao com servios externos, etc.

    A grande maioria dos frameworks possui um exemplo como desenvolver um blog usandoX, ento fica mais fcil para comparao se voc j estudou algum outro framework comoCakePHP, CodeIgniter ou mesmo Ruby on Rails

    ModelagemAgora que o convenci (ou no) que desenvolver um blog pode lhe ajudar a entender o ZendFramework, vamos mostrar a modelagem das tabelas:

    Modelagem

    Simples, como deveria ser.

  • Definindo o projeto 7

    Criao das tabelasUsando alguma ferramenta, como o PHPMyAdmin, SequelPro, ou o bom e velho terminal, possvelcriar a estrutura do banco usando os comandos SQL abaixo:

    1 create database iniciandozf2;23 GRANT ALL privileges ON iniciandozf2.* TO zend@localhost IDENTIFIED BY 'zend';45 use iniciandozf2;67 CREATE TABLE IF NOT EXISTS `users` (8 `id` INT NOT NULL AUTO_INCREMENT ,9 `username` VARCHAR(200) NOT NULL ,10 `password` VARCHAR(250) NOT NULL ,11 `name` VARCHAR(200) NULL ,12 `valid` TINYINT NULL ,13 `role` VARCHAR(20) NULL ,14 PRIMARY KEY (`id`) )15 ENGINE = InnoDB;1617 CREATE TABLE IF NOT EXISTS `posts` (18 `id` INT NOT NULL AUTO_INCREMENT ,19 `title` VARCHAR(250) NOT NULL ,20 `description` TEXT NOT NULL ,21 `post_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,22 PRIMARY KEY (`id`) )23 ENGINE = InnoDB;2425 CREATE TABLE IF NOT EXISTS `comments` (26 `id` INT NOT NULL AUTO_INCREMENT ,27 `post_id` INT NOT NULL ,28 `description` TEXT NOT NULL ,29 `name` VARCHAR(200) NOT NULL ,30 `email` VARCHAR(250) NOT NULL ,31 `webpage` VARCHAR(200) NOT NULL ,32 `comment_date` TIMESTAMP NULL ,33 PRIMARY KEY (`id`, `post_id`) ,34 INDEX `fk_comments_posts` (`post_id` ASC) ,35 CONSTRAINT `fk_comments_posts`36 FOREIGN KEY (`post_id` )37 REFERENCES `posts` (`id` )

  • Definindo o projeto 8

    38 ON DELETE NO ACTION39 ON UPDATE NO ACTION)40 ENGINE = InnoDB;

    https://gist.github.com/eminetto/284eddfbc1370c113ee2

    Configurando o projetoO Zend Framework 2 conta com arquivos de configurao separados que so unificados no momentoda execuo.Os principais arquivos que iremos usar durante o projeto so:

    config/application.config.php: Arquivo com as configuraes gerais da aplicao. So confi-guraes usadas por todos os mdulos e componentes.

    config/autoload/global.php e config/autoload/local.php: O arquivo global.php usado comoauxiliar ao application.config.php pois tambm contm configuraes para a aplicao comoum todo. A idia colocar neste arquivo configuraes que podem mudar de acordo coma mquina do desenvolvedor. Um exemplo so as configuraes da conexo com o banco dedados. Estas configuraes podem ser alteradas para as mquinas locais, dos desenvolvedores.Para isso o desenvolvedor sobrescreve as configuraes no local.php. O arquivo local.php nodeve ser salvo no controle de verses (svn ou git por exemplo).

    module/Nome/config/module.config.php: Configuraes especficas ao mdulo.

    Os arquivos de configurao so geralmente scripts PHP que retornam arrays de configurao. Sorpidos durante a execuo e de fcil leitura.

    global.php1

  • Definindo o projeto 9

    https://gist.github.com/eminetto/24d2462ed652ca7ffc14

    local.php1

  • ModelosVamos comear o desenvolvimento pela primeira camada da nossa aplicaoMVC: os modelos. Paraisso vamos criar um arquivo para cada tabela e estes devem ser armazenados no diretrioModel dosrc do mdulo, como no exemplo: module/Application/src/Application/Model .

    Criando a entidade PostO primeiro passo criar o diretrio (caso no exista) de modelos:

    1 mkdir module/Application/src/Application/Model

    E criar dentro dele o arquivo Post.php com o contedo:

    1

  • Modelos 11

    https://gist.github.com/eminetto/a38dc854af21e32447e4O primeiro ponto importante a ser salientado o uso do conceito deNamespaces. O Zend Framework2 usa extensivamente o conceito de Namespaces que foi introduzido no PHP 5.3. Na primeira linhaindicamos a qual espao o cdigo que vamos escrever pertence, sendo obrigatrio sempre termos um.Nas prximas linhas podemos indicar quais componentes vamos precisar e de quais namespaces elespertencem usando o comando use (vamos ver isso nas prximas pginas). Fazendo isso as classes soautomaticamente carregadas, sem precisarmos nos preocupar em usar include ou require, deixandoessa tarefa para o mecanismo de autoloading implementado pelo framework. Mais informaessobre namespaces podem ser encontradas no manual do PHP.A classe Post apenas uma representao dos dados da base de dados, ela precisa ser manipulada poralguma outra classe. Podemos usar duas ferramentas para fazer essa manipulao: um TableGatewayou um ORM como o Doctrine. A funo de um TableGateway realizar operaes sobre entidadespois elas no possuem comportamento. As principais operaes como inserir, remover, atualizar,pesquisar sero sempre feitas atravs desse gateway. Existem muitas vantagens nessa abordagemcomo podermos mudar a camada das entidades (substituir por entidades do ORM Doctrine porexemplo, que no vamos ver neste livro) ou mudar o comportamento de todas as entidades apenasalterando os gateways. Vamos agora criar um TableGateway para manipular a classe Post no arquivomodule/Application/src/Application/Model/PostTableGateway.php:

    1

  • Modelos 12

    24 $rowset = $this->tableGateway->select(array('id' => $id));25 $row = $rowset->current();26 if (!$row) {27 throw new \Exception("No encontrado id $id");28 }29 return $row;30 }3132 public function save(Post $post)33 {34 $data = array(35 'title' => $post->title,36 'description' => $post->description,37 'post_date' => $post->post_date,38 );3940 $id = (int) $post->id;41 if ($id == 0) {42 $this->tableGateway->insert($data);43 } else {44 if ($this->get($id)) {45 $this->tableGateway->update($data, array('id' => $id));46 } else {47 throw new \Exception('Post no existe');48 }49 }50 }5152 public function delete($id)53 {54 $this->tableGateway->delete(array('id' => (int) $id));55 }56 }

    https://gist.github.com/eminetto/0d5e1e5b11a53523ee36Como podemos ver no cdigo acima, a classe PostTableGateway precisa de uma instncia da classeTableGateway para ser criada, ento podemos dizer que esta classe possui uma dependncia. Porsua vez a classe TableGateway tambm possui uma srie de dependncias, o que comea a tornarcomplexo o uso do sistema. Para simplificar estes casos o framework possui um componente muitotil chamado ServiceManager onde podemos registrar todas as dependencias das nossas classes e elese encarrega de cria-las para nos, sempre que precisarmos. No arquivo de configuraes do nossomdulo vamos incluir estas novas regras de dependncias, alterando o arquivo module/Applicati-

  • Modelos 13

    on/config/module.config.php:

    1 'service_manager' => array(2 'abstract_factories' => array(3 'Zend\Cache\Service\StorageCacheAbstractServiceFactory',4 'Zend\Log\LoggerAbstractServiceFactory',5 ),6 'aliases' => array(7 'translator' => 'MvcTranslator',8 ),9 'factories' => array(10 'Application\Model\PostTableGateway' => function($sm) {11 $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');12 $resultSetPrototype = new Zend\Db\ResultSet\ResultSet();13 $resultSetPrototype->setArrayObjectPrototype(new Application\Mode\14 l\Post());15 $tableGateway = new Zend\Db\TableGateway\TableGateway('posts, $d\16 bAdapter, null, $resultSetPrototype);17 $postTableGateway = new Application\Model\PostTableGateway($table\18 Gateway);19 return $postTableGateway;20 },21 ),22 ),

    https://gist.github.com/eminetto/b6487feb6f0de85ada38O que estamos dizendo ao framework e: sempre que eu solicitar o servicoApplication\Model\PostTableGatewayexecute esta funcao anonima com todos os passos necessrios para sua criao e me retorne umainstancia pronta do servico. No prximo captulo vamos ver como usar o ServiceManager para nosentregar a instncia do PostTableGateway configurada e pronta para uso.Vou deixar a configurao das outras tabelas do banco de dados como exerccio para o leitor e vamosagora trabalhar com a prxima camada, os controladores.

  • Controladores, rotas e visesControladoresOs controladores so responsveis pela interao com o usurio, interceptando as invocaes porurls, cliques em links, etc. O controlador ir receber a ao do usurio, executar algum servio,manipular alguma classe da camada de modelo e, geralmente, renderizar uma tela da camada deviso, para gerar uma resposta para o usurio.O primeiro controlador que iremos criar o responsvel por mostrar todos os posts de nossa tabela,para que o usurio os visualize.Para criar um controlador precisamos escrever uma classe que implemente a interfaceDispatchable.O Zend Framework fornece algumas classes que implementam esta interface, facilitando o nossouso, como a AbstractActionController e a AbstractRestfulController.Vamos criar o controlador, no arquivo module/Application/src/Application/Controller/PostControl-ler.php:

    1

  • Controladores, rotas e vises 15

    22 $tableGateway = $this->getServiceLocator()->get('Application\Model\PostTable\23 Gateway');24 $posts = $tableGateway->fetchAll();25 return new ViewModel(array(26 'posts' => $posts27 ));28 }29 }

    https://gist.github.com/eminetto/86e810dac94a3f761d73Podemos ver agora a utilizao do ServiceManager para nos entregar uma instncia do PostTable-Gateway, conforme configuramos no captulo anterior e o uso do seu mtodo fetchAll() que vairetornar todos os registros da tabela. A indexAction cria uma instncia da classe ViewModel e aconfigura com uma varivel chamada posts com o resultado da consulta com a base de dados. Aoretornar a instncia de ViewModel estamos solicitando ao framework que renderize o HTML daviso. Como no indicamos alguma viso em especfico a viso padro ser renderizada. Comoestamos acessando a action index do controlador PostController o framework ir procurar umarquivo chamado index.phtml no diretrio: module/Application/view/application/post/.

    VisesApesar da extenso diferente (.phtml) a viso no passa de um arquivo PHP onde podemos usartodas as funes nativas da linguagem e mais alguns componentes especiais, chamados de ViewHelpers.O contedo do arquivo index.phtml :

    1 2 3 4 Criar Post5 6 7 8 Lista de Posts9 10 11 12 Ttulo13 Texto14 Data

  • Controladores, rotas e vises 16

    15 Opes16 17 18 19 20 21 22 23 24 32 33 34

  • Controladores, rotas e vises 17

    1

    Este um exemplo de uso de um ViewHelper, o escapeHtml, que limpa quaisquer tags HTML quepossam existir no texto. O mesmo vale para o dateFormat que faz a formatao das datas.

    LayoutsNeste momento cabe explicar um novo conceito: layouts. O Zend Framework trabalha com a idiade layouts, que so molduras ou pginas padro mescladas com as vises dos controladores, comoa index.phtml.Usando uma imagem para ilustrar um exemplo:

    Wireframe mostrando o layout

    Em todas as pginas teremos um ttulo, uma imagem e um rodap, com informaes sobre o autor,copyright, etc. A nica informao que mudar o contedo das pginas, como o index.phtml queacabamos de criar, mas o cabealho e o rodap permanecem os mesmos.Podemos ter vrios layouts e usarmos o mais indicado em cada controlador ou action. O cdigo dolayout padro do Zend Framework 2 est no arquivomodule/Application/view/layout/layout.phtml:

  • Controladores, rotas e vises 18

    1 23 4 5 6 89 1314 15 2223 24 3233 34 35 36 37 38 40 41 42

  • Controladores, rotas e vises 19

    43 44

  • Controladores, rotas e vises 20

    Vamos primeiro habilitar o controlador no arquivo de configuraes do nosso mdulo, omodule/Ap-plication/config/module.config.php, na opo controllers :

    1 'controllers' => array(2 'invokables' => array(3 'Application\Controller\Index' => 'Application\Controller\IndexContro\4 ller',5 'Application\Controller\Post' => 'Application\Controller\PostControll\6 er'7 ),8 ),

    O prximo passo criarmos a rota.Vamos abrir um pequeno parnteses aqui, e comentar sobre como os controladores e actionsfuncionam. Geralmente os controladores so classes com o nome terminando em Controller comoo PostController (apesar disso no ser mais obrigatrio no Zend Framework 2 ainda continua-seusando esse padro). Cada controlador possui uma ou mais actions que so mtodos pblicos cujonome termina com Action como o indexAction. As actions so as aes que os usurios podemacessar via URL, links ou botes na tela. Por exemplo, caso o usurio acesse a url:

    1 http://iniciando-zf2.dev/admin/index/index/id/1

    Isto traduzido pelo framework usando o padro:

    1 http://servidor/modulo/controller/action/parametro/valor

    Ento:

    Servidor = iniciando-zf2.dev Mdulo = Admin Controller = IndexController.php Action = indexAction (dentro do arquivo IndexController.php) Parmetro = id Valor = 1

    Este o comportamento padro esperado pelo framework mas ns podemos criar as nossas rotasda melhor forma que nosso projeto necessitar. Vamos criar as seguintes rotas para nosso pequenoprojeto:

    /post: vai ser a lista de posts. A lgica vai estar no indexAction

  • Controladores, rotas e vises 21

    /post/save: vai ser a incluso de posts. A lgica vai estar no saveAction /post/save/id/NUMERO: vai ser a edio de posts. A lgica tambm vai estar no saveAction /post/delete/id/NUMERO: vai ser a excluso de posts. A lgica vai estar no deleteAction

    Para isso vamos criar uma nova chave no array router do arquivo module/Application/config/mo-dule.config.php, logo aps a chave application:

    1 'post' => array(2 'type' => 'segment',3 'options' => array(4 'route' => '/post[/][:action][/:id]',5 'constraints' => array(6 'action' => '[a-zA-Z][a-zA-Z0-9_-]*',7 'id' => '[0-9]+',8 ),9 'defaults' => array(10 'controller' => 'Application\Controller\Post',11 'action' => 'index',12 ),13 ),14 ),

    https://gist.github.com/eminetto/ce1ce0286d6450ac5116Podemos agora acessar a URL http://iniciando-zf2.dev/post e visualizarmos os posts cadastrados nabase de dados. Os botes ainda no vo funcionar pois no criamos as novas actions. Faremos issono prximo captulo.

    DesafioNeste captulo vimos o controlador, views e rotas para manipularmos a entidade Post. Como desafiodeixo ao leitor a incluso de uma nova funcionalidade: a listagem de comentrios do post.

  • FormulriosO Zend Framework 2 possui um componente para auxiliar na criao dos formulrios, o Zend\Form.Vamos criar o nosso primeiro formulrio, o module/Application/src/Application/Form/Post.php :

    1

  • Formulrios 23

    34 ),35 'options' => array(36 'label' => 'Texto do post',37 ),38 ));39 $this->add(array(40 'name' => 'submit',41 'attributes' => array(42 'type' => 'submit',43 'value' => 'Enviar',44 'id' => 'submitbutton',45 ),46 ));47 }48 }

    https://gist.github.com/eminetto/0dfea8a3ef47061fb742O cdigo bastante explicativo, mas vou citar alguns pontos importantes:

    1 $this->setAttribute('method', 'post');2 $this->setAttribute('action', '/post/save');

    Estamos configurando o mtodo de envio dos dados para o mtodo POST e indicando que aACTIONdo formulrio, ou seja, para onde os dados sero enviados, a url /post/save. Isso significa queprecisamos tambm criar uma nova action no PostController, o que faremos em breve.

    1 $this->add(array(2 'name' => 'title',3 'attributes' => array(4 'type' => 'text',5 ),6 'options' => array(7 'label' => 'Ttulo',8 ),9 ));

    Neste trecho estamos criando um input HTML do tipo text e configurando seu nome e label.Para cada input existe um componente no namespace Zend\Form\Element, como pode ser vistono manual do framework.Antes de criarmos a action que ir usar este formulrio para criar e editar os posts precisamospensar em um ponto importante de qualquer aplicao: a validao dos campos. Podemos fazer isto

  • Formulrios 24

    de diversas formas mas a mais indicada centralizarmos esta validao no local onde fazemos arepresentao dos dados, ou seja, na classeModel\Post. Vamos alterar a classe para incluir o uso doscomponentes do Zend\InputFilter. A verso atualizada da classe encontra-se abaixo:1

  • Formulrios 25

    40 if (!$this->inputFilter) {41 $inputFilter = new InputFilter();4243 $inputFilter->add(array(44 'name' => 'id',45 'required' => true,46 'filters' => array(47 array('name' => 'Int'),48 ),49 ));5051 $inputFilter->add(array(52 'name' => 'title',53 'required' => true,54 'filters' => array(55 array('name' => 'StripTags'),56 array('name' => 'StringTrim'),57 ),58 'validators' => array(59 array(60 'name' => 'StringLength',61 'options' => array(62 'encoding' => 'UTF-8',63 'min' => 1,64 'max' => 100,65 ),66 ),67 ),68 ));6970 $inputFilter->add(array(71 'name' => 'description',72 'required' => true,73 'filters' => array(74 array('name' => 'StripTags'),75 array('name' => 'StringTrim'),76 ),77 ));7879 $inputFilter->add(array(80 'name' => 'post_date',81 'required' => false,

  • Formulrios 26

    82 'filters' => array(83 array('name' => 'StripTags'),84 array('name' => 'StringTrim'),85 ),86 ));8788 $this->inputFilter = $inputFilter;89 }9091 return $this->inputFilter;92 }9394 //necessrio para o uso dos forms95 public function getArrayCopy()96 {97 return get_object_vars($this);98 }99 }

    https://gist.github.com/eminetto/d0354d3992d704ea08b1Alguns detalhes quanto ao que podemos configurar:

    Se os campos sao obrigatorios ou nao, usando o required com valor true ou false (exemplo:linha 45)

    Os filtros. Exemplos podem ser encontrados no filtro Int (linha 47), que transforma o campoem inteiro; StripTags (linha 55) que remove quaisquer tags HTML/JavaScript no texto; eStringTrim (linha 56) que remove espacos no comeco e final do texto. Existem outros filtros quepodem ser encontrados no manual do framework, alem da possibilidade de criarmos outros.

    As validacoes. Um exemplo pode ser encontrado no StringLength (linhas 60 a 66) que validase o campo possui a codificacao de carecteres UTF-8 e se o tamanho esta entre 1 e 100. Casoalgum desses parametros nao for respeitado (por exemplo tentando salvar 101 caracteres) seragerada uma Exception indicando que o campo esta invalido. Existem outros validadores quepodem ser encontrados no manual do framework, alem da possibilidade de criarmos outros.

    Ao centralizarmos a configuracao dos filtros e validadores na entidade podemos reusa-los em outrospontos do projeto, como no uso de formularios ou ate no acesso via uma API.Tambm incluimos o mtodo getArrayCopy que usado internamente pelo formulrio para fazer opreenchimento automtico dos dados.Vamos agora criar a action que far uso do formulrio e as configuraes de validao. Vamos incluiro saveAction no PostController:O cdigo atualizado do module/Application/src/Application/Controller/PostController.php:

  • Formulrios 27

    1

  • Formulrios 28

    4344 /**45 * Cria ou edita um post46 * @return void47 */48 public function saveAction()49 {50 $form = new PostForm();51 $tableGateway = $this->getTableGateway();52 $request = $this->getRequest();53 /* se a requisio post os dados foram enviados via formulrio*/54 if ($request->isPost()) {55 $post = new PostModel;56 /* configura a validao do formulrio com os filtros57 e validators da entidade*/58 $form->setInputFilter($post->getInputFilter());59 /* preenche o formulrio com os dados que o usurio digitou na tela*/60 $form->setData($request->getPost());61 /* faz a validao do formulrio*/62 if ($form->isValid()) {63 /* pega os dados validados e filtrados */64 $data = $form->getData();65 /* armazena a data de incluso do post*/66 $data['post_date'] = date('Y-m-d H:i:s');67 /* preenche os dados do objeto Post com os dados do formulrio*/68 $post->exchangeArray($data);69 /* salva o novo post*/70 $tableGateway->save($post);71 /* redireciona para a pgina inicial que mostra todos os posts*/72 return $this->redirect()->toUrl('/post');73 }74 }75 /* essa a forma de recuperar um parmetro vindo da url como:76 http://iniciando-zf2.dev/post/save/177 */78 $id = (int) $this->params()->fromRoute('id', 0);79 if ($id > 0) { // uma atualizao80 /* busca a entidade no banco de dados*/81 $post = $tableGateway->get($id);82 /* preenche o formulrio com os dados do banco de dados*/83 $form->bind($post);84 /* muda o texto do boto submit*/

  • Formulrios 29

    85 $form->get('submit')->setAttribute('value', 'Edit');86 }87 return new ViewModel(88 array('form' => $form)89 );90 }9192 /**93 * Exclui um post94 * @return void95 */96 public function deleteAction()97 {98 $id = (int) $this->params()->fromRoute('id', 0);99 if ($id == 0) {100 throw new \Exception("Cdigo obrigatrio");101 }102 /* remove o registro e redireciona para a pgina inicial*/103 $tableGateway = $this->getTableGateway()->delete($id);104105 return $this->redirect()->toUrl('/post');106 }107108 }

    https://gist.github.com/eminetto/62c62140933ad70e7481Na nova verso inclu tambm omtodo deleteAction que faz a excluso do post e fiz uma refatoraocriando o mtodo getTableGateway para deixar o cdigo mais legvel. Esse controlador agora possuidiversos novos e importantes conceitos. Para facilitar o entendimento de cada um deles eu incluios comentrios explicando cada trecho de cdigo. Recomendo a leitura com ateno do cdigoacima, mas um dos trechos mais interessantes o $form->setInputFilter($post->getInputFilter());pois usamos a configurao de validao da camada de modelos direto no formulrio, sem precisarreescrever nada. Isso ajuda muito na manuteno das regras de validao.O prximo passo criar a viso para esta nova action, no arquivo module/Application/view/appli-cation/post/save.phtml:

    1

  • Formulrios 30

    o que precisamos para que o formulrio seja transformado em HTML. Podemos mudar a formacomo o cdigo HTML gerado ao alterar as configuraes do objeto form. No manual do frameworktemos mais detalhes sobre isso.Com isto terminamos a criao do nosso CRUD (Create, Retrieve, Update, Delete) da classe Post.Deixo como exerccio para o leitor fazer o mesmo para as classes Comment e User, conformeapresentadas nos captulos anteriores.

  • Prximos passosNeste e-book apenas arranhamos a superfcie, vimos s o comeo do que podemos fazer com oZendFramework 2. A ideia era apenas apresentar o bsico e deixar o leitor com vontade de aprofundaros conhecimentos neste vasto universo.Como sugestes de caminhos a seguir eu deixo o seguinte:

    O meu e-book Zend Framework 2 na prtica uma verso mais completa e aprofundada,mostrando como usar componentes avanados como Cache, Tradues, Paginador, Mdulos,Eventos e Servios. Usado este link voc pode comprar a verso digital com desconto. Tambmexiste uma verso impressa do livro, que pode ser comprada neste link. E existe um curso emforma de video aulas baseado no contedo do livro que pode ser acessado no Code Squad

    O guia de referncia do Zend Framework de grande utilidade, principalmente quando odesenvolvedor j sabe os componentes que vai usar e precisa aprofundar-se nos detalhes eexemplos de uso.

    Outra ferramenta que bastante usada em conjunto com o Zend Framework 2 o Doctrine,um ORM que facilita o trabalho com a camada de modelo das aplicaes. Escrevi um e-booksobre o Doctrine onde apresento de forma prtica o framework incluindo como us-lo com oZend Framework 2. Neste link voc pode comprar o e-book com desconto.

    Espero que eu tenha conseguido demonstrar um pouco do poder do Zend Framework 2 e tambm daminha empolgao com a ferramenta. Venho usando o framework, em conjunto com o Doctrine, emdiversos projetos desde o seu lanamento e a produtividade impressionante, bem como a robustezdas solues criadas.Para entrar em contato comigo amaneiramais facil e pelomeu site pessoal, o http://eltonminetto.net.La voce encontra todos os meus contatos, como e-mail, Twitter, etc.Happy coding para voce!

    ndice analticoIntroduoInstalandoRequisitosInstalando o framework

    Definindo o projetoDescrioModelagemCriao das tabelasConfigurando o projeto

    ModelosCriando a entidade Post

    Controladores, rotas e visesControladoresVisesLayoutsRotasDesafio

    FormulriosPrximos passos