Vous êtes sur la page 1sur 19

Iniciando com o Zend Framework

Autor Rob Allen, www.akrabat.com Traduo Gilberto Albino Reviso do document 1.7.6 Todos os direitos 2006, 2011

Este tutorial tem como objetivo oferecer uma introduo em como utilizar o Zend Framework atravs da criao de uma aplicao baseada em banco de dados utilizando o paradigma Model-View-Controller. Nota: Este tutorial foi testado na verso 1.10.1 ate 1.11.4 do Zend Framework. H uma chance muito boa de funcionar com verses posteriores da srie 1.x, mas no ir funcionar com verses anteriores a 1.10.1.

Requerimentos
O Zend Framework necessita dos seguintes requerimentos: PHP 5.2.4 (ou superior) Um servidor web com suporte a mod_rewrite ou funcionalidade similar.

Pressupostos do Tutorial
Assumindo que voc tem rodando o PHP 5.2.4 ou superior com o servidor web Apache, sua instalao do Apache obrigatriamente deve ter a extenso mod_rewrite instalada e congurada. Voc obrigatriamente precisa se certicar que o Apache est congurado com suporte a arquivos .htaccess. Isto feito normalmente alterando a congurao:
! AllowOverride None AllowOverride All

para
!

no seu arquivo httpd.conf. Para detalhes exatos verique na documentao da distribuio de seu Apache. Voc no conseguir acessar qualquer outra pgina alm da pagina inicial neste tutorial se no congurar corretamente o mod_rewrite e .htaccess.

Obtendo o framework
O Zend Framework pode ser baixado gratuitamente em http://framework.zend.com/download/latest nos formatos .zip ou .tar.gz. Olhe abaixo na pagina para os links diretos. Voc precisa da verso Minimal.

Congurando a Zend_Tool
O Zend Framework fornecido com uma nova ferramenta de linha de commando. Vamos comear congurando-a.

Zend_Tool para Windows


Crie um novo diretrio em Arquivos de Programas chamado ZendFrameworkCli D um duplo clique no arquivo baixado, ZendFramework-1.10.6-minimal.zip. Copie as pastas bin e library da janela da pasta ZendFramework-1.10.6-minimal.zip para a pasta C:\Arquivos de Programas\ZendFrameworkCli. Esta pasta deve agora conter duas sub-pastas: bin e library. Adicione o diretrio bin para o seu Path do sistema: V para a seo Sistema do Painel de Controle. Escolha Conguraes Avanadas e ento pressione o boto Variveis de Ambiente. Em na lista Variveis do Sistema, encontre a varivel Path e d um duplo clique.
Page 1 of 19

Adicione ;C:\Arquivos de Programas\ZendFrameworkCli\bin no nal da campo de entrada e pressione o boto OK. (O ponto-e-vrgula inicial obrigatrio!) Reinicie.

Zend_Tool para OS X (Linux similiar)


Extraia o arquivo ZendFramework-1.10.6-minimal.zip em seu diretrio Downloads fazendo duplo clique nele. Copie para /usr/local/ZendFrameworkCli abrindo o Terminal e digitando: sudo cp -r ~/Downloads/ZendFramework-1.10.6-minimal /usr/local/ ZendFrameworkCli Edite seu bash_prole para disponibiliar um alias: A partir do Terminal, digite: open ~/.bash_profile Adicione alias zf=/usr/local/ZendFrameworkCli/bin/zf.sh para o nal do arquivo Salve e saia do TextEdit. Saia do Terminal.

Testando o Zend_Tool
Voc pode testar sua instalao da interface de linha de comando do Zend_Tool abrindo o Terminal ou Prompt de Comando e digitando:
! zf show version

Se tudo deu certo, voc dever ver:


! Zend Framework Version: 1.10.0

Se no, verique o caminho de sua instalao est correto e se o diretrio bin existe no diretrio ZendFrameworkCli. Uma vez que a ferramenta zf esteja funcionando, zf --help lhe mostrar todos os commandos disponveis. Nota: Se sua distribuio do PHP vem com Zend Framework, por favor, verique se ela no est utilizando o ZF 1.9, pois este tutorial no vai funcionar. No momento da criao deste tutorial, a distribuio do xampp trazia.

A aplicao do tutorial
Agora que todas as peas esto no lugar que precisamos para construir uma aplicao com Zend Framework, vamos analisar a aplicao que iremos construir. Vamos construir um sistema simples de controle de lbuns para exibir nossa coleo de CDs. A pgina principal ir lista nossa coleo e permitir que possamos Adicionar, Editar e Excluir CDs. Assim como em qualquer engenharia de software, bom se for feito um pequeno planejamento antecipado. Vamos precisar de quatro pginas para nosso site: Pgina Inicial Adicionar Novo lbum Editar lbum Deletar lbum Esta pgina ir exibir a lista de lbuns e oferecer links para edit-los ou exclu-los. Tambm um link para adicionar um novo lbum ser oferecido. Esta pgina fornecer um formulrio para adicionar um novo lbum Esta pgina fornecer um formulrio para editar um Esta pgina conrmar se queremos excluir um lbum e ento exclu-lo.

Ns tambm precisaremos armazenar nossos dados dentro de um banco de dados. Somente precisaremos de uma tabela com estes campos dentro:

Page 2 of 19

Nome do Campo id artist title

Tipo integer varchar(100) varchar(100) No No No

Null?

Notas Primary key, auto increment

Tirando nossa aplicao do papel


Vamos comear a construir nossa aplicao. Onde for possvel, vamos utilizar a linha de comando da ferramenta zf uma vez que ela economiza tempo e esforo. O primeiro trabalho criar o esqueleto de arquivos e diretrios. Abra o Terminal ou Prompt de Comando e modique o diretrio atual para o diretrio raiz de seu servidor web utilizando o comando cd. Certique se voc possui permisses para criar arquivos neste diretrio e que seu servidor tem permisses de leitura. Digite:
zf create project zf-tutorial

A ferramenta ZF criar um diretrio chamado zf-tutorial e preencher com a estrutura de diretrio recomendada. Esta estrutura assume que voc tenha total controle sobre sua congurao do Apache, com a nalidade de manter a maior parte dos arquivos fora do diretrio raiz do site. Voc dever ver os seguintes arquivos e diretrios:

(H tambm um arquivo oculto .htaccess dentro de public/). O diretrio application/ onde o cdigo-fonte do website reside. Como voc pode ver, separamos os diretrios para os arquivos model, view e controller de nossa aplicao. O diretrio public/ o diretrio de alcance publico, o que signica que o URL para chegar at a aplicao ser http://localhost/zftutorial/public/. Isto feito para que a maior parte dos arquivos da aplicao no sejam acessados diretamente pelo Apache e, portanto, esto mais seguros. Nota:
Page 3 of 19

Em um site online, voc precisa criar um virtual host para o website e congurar o diretrio raiz diretamente para o diretrio public. Por exemplo, voc pode criar um virtual host chamado zftutorial.localhost, que deve se parecer com isto:
<VirtualHost *:80> ServerName zf-tutorial.localhost DocumentRoot /var/www/html/zf-tutorial/public <Directory "/var/www/html/zf-tutorial/public"> AllowOverride All </Directory> </VirtualHost>

O site ento seria acessado utilizando http://zf-tutorial.localhost/ (certique-se de que voc atualizou seu arquivo /etc/hosts ou o arquivo c:\windows\system32\drivers\etc\hosts le para que zf-tutorial.localhost seja mapeado para 127.0.0.1). No faremos isto neste tutorial, apesar de que isto to simples quanto utilizar um subdiretrio para testes. Os arquivos de imagens, JavaScript e CSS auxiliares so armazenados em um diretrio separado dentro do diretrio public/. Os arquivos do Zend Framework baixados devem ser colocados dentro do diretrio library/. Se precisarmos utilizar quaisquer outras bibliotecas, elas tambm podem ser colocas ai. Copie o diretrio library/Zend/ do arquivo baixado (ZendFramework-1.10.6-minimal.zip) para dentro de seu diretrio zf-tutorial/library/, para que seu diretrio zf-tutorial/library/ contenha um subdiretrio chamado Zend/. Voc pode testar se tudo est certo acessando http://localhost/zf-tutorial/public. Voc deve ver algo parecido com isto:

Por trs do Processo de Iniciao (Bootstrap)


Page 4 of 19

O controlador do Zend Frameworks utiliza o Padro de Software Front Controller e roteia todas as solicitaes atravs de um nico arquivo index.php. Isto garante que o ambiente est congurado corretamente para rodar a aplicao (conhecido como bootstrapping). Ns obtemos isto utilizando um arquivo .htaccess dentro do diretrio zf-tutorial/public que gerado por pelo Zend_Tool no qual redireciona todas as solicitaes para public/index.php que tambm pelo Zend_Tool. O arquivo index.php o ponto de entrada para nossa aplicao e utilizado para criar uma instncia de Zend_Application para inicializar nossa aplicao e ento execut-la. Este arquivo dene duas constantes: APPLICATION_PATH e APPLICATION_ENV que denem o caminho para o diretrio application/ e o modo do ambiente da aplicao. O padro denido como production no index.php, mas voc deve congur-lo para development no arquivo .htaccess adicionando esta linha:
SetEnv APPLICATION_ENV development

O component Zend_Application utilizado para iniciar a aplicao e est congurado para utilizar as diretivas de congurao do arquivo application/configs/application.ini. Este arquivo tambm gerado automaticamente pelo zf. Uma classe Bootstrap que extende Zend_Application_Bootstrap_Bootstrap fornecida no arquivo application/Bootstrap.php que pode ser utilizada para executar qualquer cdigo de iniciao especco. O application.ini, que est armazenado no diretrio application/configs carregado utilizando o component Zend_Config_In. O Zend_Config_Ini entende o conceito de herana das sees que so denidas utilizando um ponto-duplo no nome da seo. Por exemplo:
[staging : production]

Isto signica que a seo staging herda todas as conguraes da seo production. A constante APPLICATION_ENV dene qual seo carregada. Obviamente, no meio do desenvolvimento, a seo development melhor e quando estiver no servidor remoto, a seo production deve ser utilizada. Colocaremos todas as modicaes que forem feitas no arquivo application.ini dentro da seo production para que todas as conguraes carreguem as alteraes que zermos.

Editando o arquivo application.ini


A primeira modicao que precisamos fazer adicionar nossa informao de fuso-horrio para as funcionalidades de data e hora do PHP. Edite o arquivo application/configs/application.ini e adicione a sua regio:

phpSettings.date.timezone = "Europe/London"

logo aps todos os outros valores phpSettings na seo [production]. Obviamente, voc deve utilizar seu prprio fuso-horrio. Estamos em uma posio agora para adicionar o cdigo especco para a aplicao.

Cdigo Especco da Aplicao


Antes de congurarmos nossos arquivos, importante entender como o Zend Framework espera que as pginas sejam organizadas. Cada pgina da aplicao conhecida como um action(ao) e aes so agrupados dentro de controllers(controlador). Para o formato de URL http://localhost/zftutorial/public/news/view, o controlador News e a ao view. Assim permitido agrupar aes relacionadas. Por exemplo, um controlador News poderia ter aes como listar, arquivos e ver. O sistema MVC do Zend Framework tambm suporta mdulos para agrupamento de controladores, mas esta aplicao no grande o suciente para se preocupar com eles!
Page 5 of 19

Por padro, o controlador do Zend Framework reserva uma ao especial chamada index como padro. Isto para casos como http://localhost/zf-tutorial/public/news/ onde a ao index dentro do controlador News ser executada. Tambm h um nome para o controlador padro, na qual tambm chamado de index e, portanto, o URL http://localhost/zf-tutorial/public/ faz com que a ao index no controlador Index seja executada. Como este um tutorial simples, no iremos nos preocupar com coisas complicadas como autenticao de usurio. Isto pode esperar por um tutorial separado ( ou voc pode ser sobre isto no livro Zend Framework in Action! ) Como quatro pginas se aplicam aos lbuns, vamos agrup-las em um nico controlador com quatro aes. Vamos usar o controlador padro e as quatro aes sero: Page Home page Adicionar novo lbum Editar album Deletar album Index Index Index Index Controller index add edit delete Action

Na medida em que o site ca mais complicado, controladores adicionais so necessrios e voc poder at mesmo agrupar controladores dentro de mdulos, se necessrio.

Congurando o Controlador
Agora estamos prontos para congurar nosso controlador. No Zend Framework, o controlador uma classe que deve ser chamada assim{Controllernome}Controller. Note que {Controller nome} deve comear com uma letra maiscula. Esta classe deve estar dentro de um arquivo chamado {Controllernome}Controller.php dentro do diretrio application/controllers. Cada ao um mtodo public dentro da classe controladora que deve ser nominada {actionnome}Action. Neste caso, {actionnome} comea com uma letra minscula e novamente deve estar completamente em minscula. Nomes de controladores e aes mistos so permitidos, mas possuem regras especiais que voc deve entender antes de comear a utiliz-los. Conra a documentao primeiro! Nossa classe controladora chamada IndexController que est denida em application/ controllers/IndexController.php e foi automaticamente criada atravs do Zend_Tool. Ela tambm contm nosso primeiro mtodo, indexAction(). Ns apenas precisamos adicionar nossas aes adicionais. A adio de aes adicionais aos controladores feita utilizando a ferramenta de linha de comando zf com o comando create action. Abra o Terminal ou Prompt de Comando e mude para o diretrio para o diretrio zf-tutorial/. Ento digite estes trs comandos:
zf create action add Index zf create action edit Index zf create action delete Index

Estes commandos criam trs novos mtodos: addAction, editAction e deleteAction em IndexController e tambm cria os scripts apropriados para o View que iremos precisar mais adiante. Agora temos todas as quarto aes que precisamos utilizar. O URL para cada ao :

Page 6 of 19

URL http://localhost/zf-tutorial/public/ http://localhost/zf-tutorial/public/index/add http://localhost/zf-tutorial/public/index/edit http://localhost/zf-tutorial/public/index/delete

Action method IndexController::indexAction() IndexController::addAction() IndexController::editAction() IndexController::deleteAction()

Voc pode testar as trs novas aes e deve ver uma mensagem como esta:

View script for controller index and script/action name add


Nota: Se voc receber um erro 404, ento voc no congurou o Apache com mod_rewrite ou no congurou corretamente o AllowOverride dentro de seu arquivo httpd.conf para que o arquivo .htaccess dentro da pasta public/ esteja sendo usado.

O Banco de Dados
Agora que ns temos o esqueleto de nossa aplicao com mtodos para as aes do controlador e os arquivos para o View prontos, hora de olhar para a seo de Models(modelos) de nossa aplicao. Lembre-se que o Model a parte que lida com o objetivo central da aplicao. ( as to famosas regras de negcio) e, em nosso caso, lida com o banco de dados. Ns utilizaremos a class Zend_Db_Table do Zend Framework que serve para encontrar, inserir, atualizar e deletar linhas de uma tabela no banco de dados.

Congurao do Banco de Dados


Para utilizar Zend_Db_Table, precisamos informar qual banco de dados utilizar com um usurio e senha. Como ns preferimos no informar esta informao todas as vezes que precisarmos, vamos utilizar um arquivo de congurao para armazenar esta informao. O Componente Zend_Application passado dentro de um recurso de congurao do banco de dados, por isto somente precisamos congurar a informao apropriada no arquivo configs/application.ini e ele far o resto. Abra application/configs/application.ini e adicione o seguinte no nal da seo [production] ( ou seja, acima da seo [staging]):
resources.db.adapter = PDO_MYSQL resources.db.params.host = localhost resources.db.params.username = rob resources.db.params.password = 123456 resources.db.params.dbname = zf-tutorial

Obviamente, voc deve utilizar seu usurio, senha e banco, no os meus! A conexo com o banco de dados ser agora feita automaticamente e o adaptador padro Zend_Db_Tables ser congurado. Voc pode ler mais sobre outros plug-ins de recursos disponveis em: http://framework.zend.com/manual/en/ zend.application.available-resources.html.

Criar a tabela no banco de dados


Como citado no planejamento inicial, iremos utilizar um banco de dados para armazenar os dados de nossos lbuns. Vou utilizar MySQL. O cdigo SQL para criar a tabela o seguinte:
CREATE TABLE albums ( id int(11) NOT NULL auto_increment, artist varchar(100) NOT NULL, title varchar(100) NOT NULL, PRIMARY KEY (id) );

Page 7 of 19

Execute este cdigo em algum cliente MySQL, tal como phpMyAdmin ou o cliente de linha de comando padro do MySQL.

Inserir os dados teste


Tambm iremos inserir algumas linhas dentro da tabela para que possamos utilizar a funcionalidade de extrao de informao da pgina inicial. Eu vou pegar os primeiros CD Bestsellers do site do Amazon UK. Execute o cdigo a seguir em seu cliente MySQL:
INSERT INTO albums (artist, title) VALUES ('Paolo Nutine', 'Sunny Side Up'), ('Florence + The Machine', 'Lungs'), ('Massive Attack', 'Heligoland'), ('Andre Rieu', 'Forever Vienna'), ('Sade', 'Soldier of Love');

Agora temos alguns dados dentro do banco de dados e podemos escrever um modelo bem simples para eles.

O Modelo (Model)
O Zend Framework no oferece uma classe Zend_Model como Modelo uma vez que o modelo sua lgica de negcio da aplicao e s depende de voc como voc deseja que ele funcione. Existem vrios componentes que voc pode utilizar para isto, dependendo de suas necessidades. Uma abordagem ter classes modelo que representem cada entidade em sua aplicao e ento utilizar objetos mapeados (mappers) que carregam e salvam as entidades no banco de dados. Esta abordagem est documentada no site do Zend Framework no QuickStart em: http://framework.zend.com/manual/en/learning.quickstart.createmodel.html. Para este tutorial, vamos criar um modelo que extende Zend_Db_Table e utiliza Zend_Db_Table_Row. O Zend Framework oferece o Zend_Db_Table que implementa o Padro de Software Table Data Gateway que permite criar uma interface com os dados de uma tabela no banco de dados. No entanto, esteja consciente que o Padro Table Data Gateway pode se tornar limitado em grandes sistemas. H tambm a tentao de colocar o cdigo de acesso ao banco de dados dentro do mtodo de uma ao, uma vez que isto possvel com Zend_Db_Table. Zend_Db_Table_Abstract uma classe abstrata, do qual derivaremos nossa classe que especica para gerenciamento dos lbuns. No importa o nome que daremos nossa classe, mas faz sentido que leve o nome da tabela do banco de dados. Nosso projeto possui uma carregador automtico ( autoloader ) padro instanciado por Zend_Application que mapeia as classes recurso dentro de um mdulo para o diretrio onde ela est denida. Para as pastas application/ utilizamos o prexo Application_. O autoloader mapeia os recursos nos diretrios utilizando este mapeamento: "
Form Form Model Model Model_DbTable Model_DbTable Model_Mapper Model_Mapper

Prexo Prex forms forms models models

Directory Diretrio

models/dbTable models/DbTable models/mappers plugins services! services views/filters views/helpers

Plugin Service! Service View_Filter! View_Filter View_Helper

Page 8 of 19

Como estamos chamando pelo nome da tabela do bando de dados album e nossa classe utilizar Zend_Db_Table ento nossa classe sera chamada Application_Model_DbTable_Albums que ser armazenada em applications/models/DbTable/Albums.php. Para informar ao Zend_Db_Table o nome da tabela que ele estar gerenciando, devemos denir a propriedade $_name com o nome da tabela. Inclusive, Zend_Db_Table assume que sua tabela possui uma chave primria chamada id que auto incrementada pelo banco de dados. O nome deste campo pode ser mudado tambm se for preciso. Podemos utilizar a ferramenta de linha de comando zf para fazer parte do trabalho, para isto, execute o comando a seguir na linha de comando:
zf create db-table Albums albums

A ferramenta agora criou o arquivo Albums.php dentro da pasta application/models/DbTable. Dentro deste arquivo est uma classe chamada Application_Model_DbTable_Albums e dentro da mesma est denido o nome da tabela do banco de dados do qual esta classe se comunicar. Agora ns precisamos adicionar alguma funcionalidade, por isto edite application/models/DbTable/ Albums.php e acione os mtodos getAlbum(), addAlbum(), updateAlbum() e deleteAlbum() e agora ele deve parecer com o cdigo abaixo:
zf-tutorial/application/models/DbTable/Albums.php <?php class Application_Model_DbTable_Albums extends Zend_Db_Table_Abstract { protected $_name = 'albums'; public function getAlbum($id) { $id = (int)$id; $row = $this->fetchRow('id = ' . $id); if (!$row) { throw new Exception("Could not find row $id"); } return $row->toArray(); } public function addAlbum($artist, $title) { $data = array( 'artist' => $artist, 'title' => $title, ); $this->insert($data); } public function updateAlbum($id, $artist, $title) { $data = array( 'artist' => $artist, 'title' => $title, ); $this->update($data, 'id = '. (int)$id); } public function deleteAlbum($id) { $this->delete('id =' . (int)$id); } Page 9 of 19

Ns criamos quarto mtodos de auxlio que nossa aplicao utilizar para se conectar com a tabela do banco de dados. getAlbum() retorna um array com uma linha nica, addAlbum() cria um novo registro no banco de dados, updateAlbum() atualiza um lbum e deleteAlbum() remove um registro complemente. O cdigo para cada um destes mtodos auto explicativo. Apesar de no ser necessrio neste tutorial, voc pode dizer ao Zend_Db_Table sobre tabelas relacionadas e ele pode buscar os dados relacionados tambm. Precisamos preencher os controladores com os dados a partir do model e obter o scripts para os views a m de exib-los, entretanto, antes que faamos isto, precisamos entender como o sistema de views do Zend Framework funciona.

Layouts e views
O componente view do Zend Framework chamado de, algo no surpreendente, Zend_View. O componente view permitir separao do cdigo que exibe as pginas do cdigo dentro dos mtodos das aes. O uso bsico de Zend_View :
$view = new Zend_View(); $view->setScriptPath('/path/to/scripts'); echo $view->render('script.php');

Pode-se facilmente ver que se colocssemos este cdigo diretamente dentro de nossos mtodos, ns estaramos repetindo um cdigo estrutural, muito chato, que no de interesse para a ao. Ao invs disto, devemos realizar a inicializao do view em qualquer outro lugar e ento acessar nosso objeto view, j inicializado dentro de cada mtodo para as aes. O Zend Framework oferece uma auxiliador (helper) para Actions chamado de ViewRenderer. Ele toma conta de inicializar a propriedade view no controlador ($this->view) para que possamos utilizar e tambm exibir um script view depois que a ao for disparada. Para a exibio, o ViewRenderer dene o objeto Zend_View para procurar em views/scripts/{controller name} pelos scripts a serem exibidos e exibir (por padro, pelo menos) o script que chamado pelo nome da ao e ter a extenso phtml. Ou seja, o script view exibido ser views/scripts/{controller nome}/{action_nome}.phtml e os contedos apresentados so anexados ao corpo do objeto Response. O Objeto Response utilizado para combinar todos os cabealhos HTTP, corpo do contedo e excees gerados como resultado da utilizao do sistema MVC. O front controller ento automaticamente envia os cabealhos seguidos pelo corpo do contedo no nal do envio. Isto tudo denido para ns atravs do Zend_Tool quando criamos o projeto e adicionamos controladores e aes utilizando os comandos zf create controller e zf create action.

Cdigo HTML em comum: Layouts


Rapidamente ca bem bvio que existe um monte de cdigos HTML em comum em nossos views, pelo menos para o cabealho e rodap e talvez para uma ou duas barras laterais tambm. Este um problema muito comum e o componente Zend_Layout foi projetado para resolver este problema. Zend_Layout permite-nos mover todo cdigo em comum para o cabealho, rodap e outros, para um script view na qual inclui o cdigo especico para a ao em execuo. O local padro para manter nossos layouts em application/layouts/ e h um recurso disponvel para Zend_Application que congurar Zend_Layout para ns. Utilizamos o Zend_Tool para criar o script do view para o layout e atualizar apropriadamente o arquivo application.ini. Novamente, abra o Terminal ou Prompt de Comando e dentro do seu diretrio zf-tutorial digite:
zf enable layout

Page 10 of 19

O Zend_Tool agora criou a pasta application/layouts/scripts e colocou um script view layout.phtml dentro dela. Ele tambm atualizou o arquivo application.ini e adicionou a linha resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/" na seo [production]. No nal do ciclo de despacho, depois que os mtodos de aes terminaram, Zend_Layout exibir nosso layout. O Zend_Tool oferece um arquivo de layout bsico que apenas exibe o contedo do script do view da ao. Vamos estender este arquivo com o HTML necessrio para nosso website. Abra layouts.phtml e substitua o cdigo dentro dele por:
zf-tutorial/application/layouts/scripts/layout.phtml <?php $this->headMeta()->appendHttpEquiv('Content-Type', 'text/html;charset=utf-8'); $this->headTitle()->setSeparator(' - '); $this->headTitle('Zend Framework Tutorial'); echo $this->doctype(); ?> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <?php echo $this->headMeta(); ?> <?php echo $this->headTitle(); ?> </head> <body> <div id="content"> <h1><?php echo $this->escape($this->title); ?></h1> <?php echo $this->layout()->content; ?> </div> </body> </html>

O arquivo layout contm o cdigo HTML externo na qual bem padro. Como este um arquivo PHP normal, podemos utilizar PHP dentro dele. H uma varivel disponvel, $this, que uma instncia do objeto view que foi criado durante o processo de inicializao. Ns podemos utilizar a mesma para recuperar dados que foram atribudos para o view e tambm para chamar mtodos. Os mtodos (conhecidos como view helpers) retornam um string que podemos ento imprimir. Primeiramente, ns conguramos alguns auxiliadores para a seo do cabealho da pgina e ento imprimimos o tipo correto de doctypte. Dentro de <body>, criamos um DIV com um <h1> contendo o ttulo. Para obter o script do view para a ao atual exibir, imprimimos o contedo reservado utilizando o auxiliador do view layout(): echo $this->layout()->content; que faz o trabalho para ns. Isto quer dizer que os scripts do view para ao so executadas antes do script do view do layout. Precisamos denir o doctype para a pgina antes de exibirmos quaisquer scripts dos views. Como os scripts do view das aes so exibidos antes, eles podem precisar conhecer qual doctype est sendo usado. Isto especialmente importante para o Zend_Form. Para denir o doctype, adicionamos uma outra linha em nosso arquivo application.ini, na seo [production]:
resources.view.doctype = "XHTML1_STRICT"

O auxiliador do view doctype() exibir o doctype correto para componentes como Zend_Form e gerar o HTML compatvel.

Estilizando
Apesar de este ser apenas um tutorial, precisamos de um arquivo CSS para fazer com que nossa aplicao parea um pouco mais apresentvel! Isto causa um probleminha uma vez que ns no sabemos como referenciar o arquivo CSS porque o URL no aponta para o diretrio raiz correto. Felizmente, um auxiliador chamado baseUrl() est disponvel para o View. Este auxiliador colecta as informaes
Page 11 of 19

requeridas a partir do objeto de solicitao e nos oferece uma parte do URL que no conhecemos. Podemos ento adicionar o arquivo CSS a seo <head> do arquivo application/layouts/scripts/ layout.phtml e mais uma vez utilizamos um auxiliador para o view, headLink():
zf-tutorial/application/layouts/scripts/layout.phtml ... <head> <?php echo $this->headMeta(); ?> <?php echo $this->headTitle(); ?> <?php echo $this->headLink()->prependStylesheet($this->baseUrl().'/css/site.css'); ?> </head> ...

Utilizando o mtodo prependStylesheet() de headLink(), nos permitido que arquivos adicionais mais especcos sejam adicionados dentro do view do controlador que ser exibido dentro da seo depois de site.css. Por m, precisamos alguns estilos CSS, portanto, crie um diretrio css dentro de public/ e adicione ao site.css o cdigo a seguir:
zf-tutorial/public/css/site.css body,html { margin: 0 5px; font-family: Verdana,sans-serif; } h1 { font-size: 1.4em; color: #008000; } a { color: #008000; } /* Table */ th { text-align: left; } td, th { padding-right: 5px; } /* style form */ form dt { width: 100px; display: block; float: left; clear: left; } form dd { margin-left: 0; float: left; } form #submitbutton { margin-left: 100px; }

Isto dever fazer com que parea um pouco mais bonito, mas como voc pode ver, eu no sou um designer!

Page 12 of 19

Podemos agora limpar os quatro scripts para aes que foram geradas automaticamente. Ento, v em frente e esvazie os arquivos index.phtml, add.phtml, edit.phtml e delete.phtml que, voc sem dvidas se lembrar, esto no diretrio application/views/scripts/index.

Listando lbuns
Agora que denimos as conguraes, informaes de banco de dados e o esqueleto de nossos views, podemos ir a fundo em nossa aplicao e exibir alguns lbuns. Isto feito na classe IndexController e comearemos listando alguns lbuns em uma tabela dentro do mtodo indexAction():
zf-tutorial/application/controllers/IndexController.php ... function indexAction() { $albums = new Application_Model_DbTable_Albums(); $this->view->albums = $albums->fetchAll(); } ...

Criamos uma instncia de nosso modelo baseado no padro Table Data Gateway. O mtodo fetchAll() retorna um Zend_Db_Table_Rowset que nos permite iterar sobre as linhas retornadas dentro do arquivo do view da ao. Podemos agora preencher o script do view associado, index.phtml:
zf-tutorial/application/views/scripts/index/index.phtml <?php $this->title = "My Albums"; $this->headTitle($this->title); ?> <p><a href="<?php echo $this->url(array('controller'=>'index', 'action'=>'add'));?>">Add new album</a></p> <table> <tr> <th>Title</th> <th>Artist</th> <th>&nbsp;</th> </tr> <?php foreach($this->albums as $album) : ?> <tr> <td><?php echo $this->escape($album->title);?></td> <td><?php echo $this->escape($album->artist);?></td> <td> <a href="<?php echo $this->url(array('controller'=>'index', 'action'=>'edit', 'id'=>$album->id));?>">Edit</a> <a href="<?php echo $this->url(array('controller'=>'index', 'action'=>'delete', 'id'=>$album->id));?>">Delete</a> </td> </tr> <?php endforeach; ?> </table>

A primeira coisa que fazemos denir o ttulo da pgina ( utilizado no layout) e tambm denir o ttulo para a seo <head> utilizando o auxiliador para view headTitle(), que exibir a barra de ttulos no navegador. Ento, criamos um hyperlink para adicionar um novo lbum. O auxiliador para url() para view, vem junto com o framework e, de grande ajuda, cria os links incluindo o URL base correto. Ns apenas atribumos os parmetros que precisamos dentro de um array e ele executar o resto. Criamos ento uma tabela html para exibir cada ttulo e artista do lbum e disponibilizamos um link para que possamos editar e deletar um registro. Um lao padro foreach utilizado para iterar na lista de lbuns, e

Page 13 of 19

utilizamos a forma alternativa com os dois pontos e endforeach; j que assim mais fcil de escanear do que tentar igualar as chaves. Novamente, o auxiliar url() utilizado para criar os links edit e delete. Se voc navegar em http://localhost/zf-tutorial/public/ (ou qualquer lugar que voc esteja realizando o tutorial!) ento voc deve ver uma bela lista de lbuns, algo parecido com:

Adicionando novos lbuns


Agora ns podemos codicar a funcionalidade para adicionar novos lbuns. Existem duas coisas nesta parte: Exibir um formulrio para o usurio informar os detalhes Processar o envio do formulrio e armazenar no banco de dados

Utilizaremos Zend_Form para realizar esta tarefa. O componente Zend_Form nos permite criar umformulrio e validar a entrada e dados. Criamos uma nova classe Form_Album que extendida a partir de Zend_Form para denir o nosso formulrio. Como esta um recurso da aplicao, a classe armazenada no arquivo Album.php dentro do diretrio forms. Vamos utilizar o script da linha de comando do zf para criar o arquivo certo:
zf create form Album

Isto cria o arquivo Album.php dentro de application/forms e inclui um mtodo init() onde poderemos denir o formulrio e adicionar os elementos que precisamos. Edite o arquivo Aplication/ forms/Album.php e remova o comentrio dentro do mtodo init() e adicione o cdigo a seguir:
zf-tutorial/application/forms/Album.php <?php class Application_Form_Album extends Zend_Form { public function init() { Page 14 of 19

$this->setName('album'); $id = new Zend_Form_Element_Hidden('id'); $id->addFilter('Int'); $artist = new Zend_Form_Element_Text('artist'); $artist->setLabel('Artist') ->setRequired(true) ->addFilter('StripTags') ->addFilter('StringTrim') ->addValidator('NotEmpty'); $title = new Zend_Form_Element_Text('title'); $title->setLabel('Title') ->setRequired(true) ->addFilter('StripTags') ->addFilter('StringTrim') ->addValidator('NotEmpty'); $submit = new Zend_Form_Element_Submit('submit'); $submit->setAttrib('id', 'submitbutton'); } $this->addElements(array($id, $artist, $title, $submit));

Dentro do mtodo init() de Application_Form_Album, criamos quatro elementos para o formulrio, respectivamente, para o id, artist, title, e boto submit. Para cada item denimos vrios atributos, incluindo o texto a ser exibido para o usurio. Para o id, queremos nos certicar que este somente do tipo inteiro, a m de evitar problemas com injeo SQL. O ltro Int far isto para ns. Para os proxies elementos de texto, adicionamos dois ltros StripTags and StringTrim para remover HTML indesejado e espao em branco desnecessrio. Tambm denimos como obrigatrios e adicionamos uma validao NotEmpty para garantir que o usurio realmente inseriu a informao que desejamos. ( o validador NotEmpty no tecnicamente obrigatrio, uma vez que sera automaticamente adicionado pelo sistema, pois setRequired() foi marcado como true; ele est aqui como uma demonstrao de como adicionar um validador.) Agora precisamos obter o formulrio para exibir e process-lo no envio. Isto feito dentro do mtodo addAction() do controlador IndexController:
zf-tutorial/application/controllers/IndexController.php ... function addAction() { $form = new Application_Form_Album(); $form->submit->setLabel('Add'); $this->view->form = $form; if ($this->getRequest()->isPost()) { $formData = $this->getRequest()->getPost(); if ($form->isValid($formData)) { $artist = $form->getValue('artist'); $title = $form->getValue('title'); $albums = new Application_Model_DbTable_Albums(); $albums->addAlbum($artist, $title); $this->_helper->redirector('index'); } else { $form->populate($formData); } } Page 15 of 19

} ...

Vamos examinar com um pouco mais de detalhes:


$form = new Application_Form_Album(); $form->submit->setLabel('Add'); $this->view->form = $form;

Instanciamos nosso Form_Album, denimos o texto para o boto submit como Add e ento atribumos o view para exibio.
if ($this->getRequest()->isPost()) { $formData = $this->getRequest()->getPost(); if ($form->isValid($formData)) {

Se o mtodo isPost() do objeto solicitado for true, ento o formulrio foi enviado e podemos ento obter os dados do formulrio a partir da solicao utilizando getPost() e vericando se o mesmo valido utilizando o mtodo isValid().
$artist = $form->getValue('artist'); $title = $form->getValue('title'); $albums = new Application_Model_DbTable_Albums(); $albums->addAlbum($artist, $title);

Se o formulrio for vlido, ento instanciamos a classe modelo Application_Model_DbTable_Albums e utilizamos o mtodo addAlbum() que criamos antes para criar um novo registro no banco de dados.
$this->_helper->redirector('index');

Depois de salvo o registro de um novo album, redirecionamos o auxiliador para ao Redirector para retornar ao index ( ou seja, voltamos para a pgina inicial ).
} else { $form->populate($formData); }

Se os dados do formulrio no forem vlidos, ento preenchemos o formulrio com os dados que usurio inseriu e exibimos novamente. Agora podemos exibir o formulrio no script do view dentro de add.phtml:
zf-tutorial/application/views/scripts/index/add.phtml <?php $this->title = "Add new album"; $this->headTitle($this->title); echo $this->form ; ?>

Como voc pod ever, exibir o formulrio muito simples, - apenas imprimimos ele, sendo que o formulrio sabe como exibir a si mesmo. Voc agora j pode utilizar o link Add new album na pgina inicial da aplicao e adicionar um novo lbum no registro.

Editando um lbum
Editar um lbum quase idntico a adicionar um, por isto o cdigo muito parecido:
zf-tutorial/application/controllers/IndexController.php Page 16 of 19

... function editAction() { $form = new Application_Form_Album(); $form->submit->setLabel('Save'); $this->view->form = $form; if ($this->getRequest()->isPost()) { $formData = $this->getRequest()->getPost(); if ($form->isValid($formData)) { $id = (int)$form->getValue('id'); $artist = $form->getValue('artist'); $title = $form->getValue('title'); $albums = new Application_Model_DbTable_Albums(); $albums->updateAlbum($id, $artist, $title); $this->_helper->redirector('index'); } else { $form->populate($formData); } } else { $id = $this->_getParam('id', 0); if ($id > 0) { $albums = new Application_Model_DbTable_Albums(); $form->populate($albums->getAlbum($id)); } }

} ...

Vamos analisar as diferenas comparando com a adio de um lbum. Primeiro, quando exibimos o formulrio para o usurio precisamos obter o artista e ttulo a partir do banco de dados e preencher os elementos do formulrio com eles. Isto est no nal do mtodo:
$id = $this->_getParam('id', 0); if ($id > 0) { $albums = new Application_Model_DbTable_Albums(); $form->populate($albums->getAlbum($id)); }

Observe que isto feito se a solicitao no for um POST, j que um POST implicaria em j termos preenchido o formulrio e o processado. Para a exibio inicial do formulrio, obtemos o id a partir da solicitao utilizando o mtodo _getParam(). Ento, utilizamos o modelo para obter a linha do registro no banco de dados e preencher o formulrio diretamente com os dados do mesmo. ( Agora voc sabe porque o mtodo getAlbum() retornou um array!) Aps validar o formulrio precisamos salvar os dados novamente no banco de dados na linha correta. Isto feito utilizando o mtodo updateAlbum() em nosso modelo:
$id = $form->getValue('id'); $artist = $form->getValue('artist'); $title = $form->getValue('title'); $albums = new Application_Model_DbTable_Albums(); $albums->updateAlbum($id, $artist, $title);

O template para o view o mesmo utilizado para o add.phtml:


zf-tutorial/application/views/scripts/index/edit.phtml <?php $this->title = "Edit album"; $this->headTitle($this->title);

Page 17 of 19

echo $this->form ; ?>

Voc agora pode editar lbuns.

Excluindo um lbum
Para deixar nossa aplicao redondinha, precisamos incluir a excluso. Temos um link Delete prximo a cada lbum em nossa pgina de listagem e a abordagem simples seria deletar quando o mesmo clicado. Isto poderia ser errado. Lembrando de nossa especicao HTTP, nos lembramos que voc no pode fazer uma operao irreversvel atravs de GET e deve usar POST para isto. Devemos apresentar um formulrio de conrmao quando o usurio clicar em Delete e se eles ento clicarem em Yes, fazermos a excluso. Como o formulrio trivial, vamos codic-lo diretamente em nosso view (Zend_Form , no nal das contas, opcional!). Comeamos com o cdigo da ao em IndexController::deleteAction():
zf-tutorial/application/controllers/IndexController.php ... public function deleteAction() { if ($this->getRequest()->isPost()) { $del = $this->getRequest()->getPost('del'); if ($del == 'Yes') { $id = $this->getRequest()->getPost('id'); $albums = new Application_Model_DbTable_Albums(); $albums->deleteAlbum($id); } $this->_helper->redirector('index'); } else { $id = $this->_getParam('id', 0); $albums = new Application_Model_DbTable_Albums(); $this->view->album = $albums->getAlbum($id); } } ...

Assim como add e edit, utilizamos o mtodo isPost() do Request para determiner se devemos exibir o formulrio de conrmao ou se devemos realizar a excluso. Utilizamos o modelo Application_Model_DbTable_Albums para realmetne excluir uma linha utilizando o mtodo deleteAlbum(). Se a solicitao no um POST, ento procuramos por um parametro ID e obtemos o registro correto no banco de dados e atribumos ao view. O script do view um simples formulrio:
zf-tutorial/application/views/scripts/index/delete.phtml <?php $this->title = "Delete album"; $this->headTitle($this->title); ?> <p>Are you sure that you want to delete '<?php echo $this->escape($this->album['title']); ?>' by '<?php echo $this->escape($this->album['artist']); ?>'? </p> <form action="<?php echo $this->url(array('action'=>'delete')); ?>" method="post"> <div> <input type="hidden" name="id" value="<?php echo $this->album['id']; ?>" /> <input type="submit" name="del" value="Yes" /> <input type="submit" name="del" value="No" /> </div> Page 18 of 19

</form>

Neste script, exibimos uma mensagem de conrmao para o usurio e ento um formulrio com botes yes e no. Na ao vericamos especicamente o valor Yes para fazer a excluso. isto a voc agora tem uma aplicao funcionando complemente.

Concluso
Isto conclui nossa breve abordagem sobre como construir uma aplicao MVC simples, mas funcional, utilizando Zend Framework. Eu espero que voc tenha considerado interessante e informativo. Se voc encontrar algo errado, por favor, envie um email para mim em rob@akrabat.com! Este tutorial abordou o bsico da utilizao do framework; existem muitos outros componentes a explorar! Eu tambm passei por cima de um monte de explicao. Meu website http://akrabat.com tem vrios artigos sobre Zend Framework e voc deve ler o manual tambm em http://framework.zend.com/manual! E por m, se voc prefere livros, eu escrevi um livro Zend Framework in Action que est disponvel para compra. Voc encontra mais detalhes disponveis em http://www.zendframeworkinaction.com. Conra!

Page 19 of 19

Vous aimerez peut-être aussi