Há muito ouço da necessidade do uso de frameworks para o desenvolvimento, e isso não ocorre a toa: eles facilitam muito essa tarefa por já possuírem a “base” que todos precisamos.
Temos vários exemplos de frameworks para PHP, como CakePHP, Symfony, CodeIgniter e Prado, mas vamos falar dessa vez do Zend, o framework da empresa responsável pelo PHP. Não que isso a torne melhor que as demais, mas tratarei dele porque vejo nele a solução para muitos problemas de maneira flexível e simples. Nesse post, falarei do básico para começar a usá-lo.
Antes de começar
Como a minha intenção nesse artigo não é explicar o MVC, padrão de arquitetura usado não só no Zend, como em outros frameworks, indico 2 links em que o assunto é melhor abordado: Wikipedia e O que é MVC um bicho de 10 cabeças ou produtividade???
É necessário habilitar no Apache o uso de .htacces e o mod_rewrite.
Para isso, abra o httpd.conf e procure a linha:
LoadModule rewrite_module modules/mod_rewrite.so
Se estiver com o famoso ‘jogo da velha’ (#) antes desse código, retire-o.
Agora procure a linha:
<directory "xxx">
onde xxx é a pasta que o Apache enxerga as suas páginas web (por padrão, é a htdocs). Certifique-se de que nas linhas abaixo contenha:
Options Indexes FollowSymLinks AllowOverride All
Primeiros Passos
Considerando que está tudo configurado no ambiente, baixe o Framework aqui e extraia-o. Agora vamos definir a estrutura de diretórios a ser usada:
Obs.: essa é uma forma quase padrão de diretórios para o Zend. Entretanto, podemos fazer a estrutura da maneira que preferirmos, pois isso é configurado no Bootstrap, que veremos mais a frente.
meuprojeto/
/application
/config
/controllers
/models
/views
/helpers
/scripts
/index
/library
/Zend
/public
/css
/img
/js
Nos arquivos que você extraiu, procure pela pasta library/Zend e copie seu conteúdo para a pasta Zend indicada na estrutura.
Bootstrap!
O Bootstap nada mais é que o ponto de partida do nosso projeto, a index.php: todas as urls desse site agora passarão primeiro pelo Bootstrap, que por sua vez chamará o Controller, que chamará a View e os Models, se necessários forem.
O index.php seria:
<?php
// configura as mensagens de erro
error_reporting(E_ALL|E_STRICT);
// chamamos todos os diretórios com classe que possamos usar
// isso é muito vantajoso já que poderemos carregar tudo como se estivesse na mesma pasta
set_include_path('.' . PATH_SEPARATOR . './library'
. PATH_SEPARATOR . './application/models'
. PATH_SEPARATOR . get_include_path());
// chama a classe do Zend, responsável por carregar as demais
include "Zend/Loader.php";
// carrega as classes necessárias
Zend_Loader::loadClass('Zend_Controller_Front'); // classe de Controllers
Zend_Loader::loadClass('Zend_Registry'); // classe que registra objetos
Zend_Loader::loadClass('Zend_View'); // classe da View
// instancia a View
$view = new Zend_View();
// coloca o caminho onde estarão as views
$view->addScriptPath('./application/views/scripts/');
// registra o objeto view
Zend_Registry::set('view', $view);
// instancia o Controller
$controller = Zend_Controller_Front::getInstance();
// seta o diretório onde estão os Controllers
$controller->setControllerDirectory('./application/controllers');
// roda o Controller e Action desejados
$controller->dispatch();
É um exemplo talvez dos mais simples de como fazer um bootstrap. O Zend nos proporciona muito mais possibilidades, mas ainda não vou me estender a elas, ficarei no básico das views e controllers.
Assim que é chamado o dispatch(), o bootstrap nos envia para o Controller que requisitamos quando acessamos o site. Mas talvez a grande dúvida seja: como sabemos onde a requisição do dispatch vai parar? A resposta é: a URL.
No Zend Framework, o controller a ser chamado depende da URL chamada. Mas para isso funcionar, precisaremos de um arquivo .htaccess, como o abaixo:
RewriteEngine on RewriteRule !\.(js|ico|gif|jpg|png|css|htm|html)$ index.php php_flag magic_quotes_gpc off php_flag register_globals off
Os dois exemplos abaixo, nos levam para o Controller index (classe IndexController)
http://localhost/meuprojeto/
http://localhost/meuprojeto/index/
Enquanto que o exemplo abaixo nos levará para um Controller de usuários (classe UsersController)
http://localhost/meuprojeto/users/
Mas isso ainda não nos mostra nada na tela além de erros: precisamos criar o controller e a view da index.
O Controller
No Zend, Controllers são classes simples, que devem seguir algumas regras:
- O nome da classe deve ter o sufixo Controller
- Deve estender a classe Zend_Controller_Action
- As actions (métodos do controller, que serão as páginas de fato) devem ter o sufixo Action
O nosso Controller Index ficaria:
<?php
class IndexController extends Zend_Controller_Action
{
public function indexAction()
{
// pega a variável view registrada no bootstrap
$view = Zend_Registry::get('view');
// cria atributos, que serão visíveis na view
$view->title = 'Página Inicial';
$view->body = 'Hello World';
// chama a view criada
echo $view->render('index/index.phtml');
}
}
Assim, criamos um controller simples, que basicamente chama uma view. Note que actions são as páginas propriamente ditas: então se você quiser criar uma página de contato por exemplo, basta criar uma action para ela. A diferença na hora de passar isso pela URL é bem simples:
http://localhost/meuprojeto/index/ vai para a action padrão do controller (que é setada por padrão como index, mas que pode ser alterada graças ao método setDefaultAction() da classe Zend_Controller_Front)
http://localhost/meuprojeto/index/index/ especifica que deve ir ao Controller Index e Action index
http://localhost/meuprojeto/users/subscribe/ especifica que deve ir ao Controller Users e Action subscribe
A partir daí, já fica também a idéia de como passar parâmetros para a Action…
View
Estamos quase lá: já temos uma página inicial, mas não temos nada para mostrar ao usuário além de erros até o momento. No Zend, o padrão para a View é o phtml, uma extensão normalmente usada para indicar que estamos usando php e html juntos.
A view para a nossa página inicial (index.phtml) ficaria:
<html> <head> <title><?php echo $this->escape($this->title); ?> </head> <body> escape($this->body); ?> </body> </html>
Lembrando que as views ficam dentro do applications/views/scripts, e essa em específico dentro de uma pasta chamada index, o que não é obrigatório, mas por organização gosto de criar páginas com os mesmos nomes dos controllers.
Rodando
Feitos todos os passos anteriores, basta chamar por http://localhost/meuprojeto/ que deve aparecer uma página de Hello World.
Com certeza o Zend tem muito mais a nos oferecer que isso, mas aqui tivemos um começo para o nosso site e espero ter colocado de maneira sucinta e informativa a base do framework. Apesar da Zend atualmente guiar seus usuários para o uso da classe Zend_Application_Bootstrap_Bootstrapper, ainda acho que o bootstrap da maneira abordada é mais fácil de entender para quem está conhecendo.
Nos próximos posts devo abordar sobre recursos mais específicos, como o Zend_DB para a conexão com Banco de Dados ou o uso do Smarty no lugar do Zend_View (é certo que a Zend está mandando muito bem nessas últimas versões com bibliotecas específicas para o Zend_View, mas gosto muito do Smarty e em algumas pesquisas vejo que não sou o único).
agosto 22nd, 2009 at 17:54 #Jadson Moreira ™
Muito bom o artigo, acredito que assim podemos dar os primeiros passos para usar o “Zend framework”. Otimo trabalho!
outubro 12th, 2009 at 20:37 #Um rápido começo no Zend Framework 1.9 | Diego Jeronymo
[...] Diego Jeronymo « Começando com o Zend Framework 1.8 [...]
abril 12th, 2010 at 16:29 #Emelia Jacaruso
Thanks a lot! That was very helpful, I just saved your website url.
junho 29th, 2010 at 9:27 #Tiago
Eu devo ter lido uns 92873451498752934 tutoriais e não entendo de jeito nenhum o funcionamento e “posicionamento” de uns arquivos, mas com o teu tu torial eu fiz o basicão ali e além de funcionar eu consegui entender direitinho.
Recomendo pra quem tá começando como eu. PARABÉNS.
setembro 2nd, 2010 at 8:10 #Vince Davis
I actually appreciate this post. We need extra persons like you bringing value for the community. Can I put this post on my blog? I’d give you credit and link back of course.