Retirado de: http://felipetonello.com/blog/2007/02/28/zend-framework-para-um-php-mais-poderoso/

Esse tutorial tem como objetivo mostrar para as pessoas que nunca viram nada sobre o ZF(Zend Framework) e estão querendo saber como ele funciona.

Quem já ouviu falar do Zend Framework? Resumidamente a Zend é uma empresa responsável pela manutenção e desenvolvimento do PHP.
A engine de orientação a objetos do php5 foi totalmente reescrita pelo pessoal da Zend.

Mas o que seria um framework?

O framework é um conjunto de classes com objetivo de reutilização de um design, provendo um guia para uma solução de arquitetura em um domínio específico de software. (Wikipedia)
Pode-se dizer que ele seria um conjunto de bibliotecas específicas.

Falando nossa lingua, o framework é um conjuntão de bibliotecas que ajuda em nosso trabalho do dia a dia, e nos trabalhos mais complicados também.

Esse artigo utiliza a versão 0.8 do framework. (dia 28/02/07)
[atualizado]
Versão atual: 1.0.1 (01/08/07)
[/atualizado]

Entendendo o Zend Framework

O Zend Framework segue o padrão MVC - Model View Controller. É um padrão de arquitetura onde separa o GUI, templates, etc(View) da lógica(Model) e do controle(Controller).
Então nele você pode usar a mesma lógica e/ou controle em diversas interfaçes com o usuário.

Usando o Zend Framework

Agora vamos arrumar a estrutura de diretórios necessária para o correto funcionamento do ZF.

diretórios

PS: a pasta ZF-tutorial fica dentro do DocumentRoot, que é onde fica suas páginas no servidor(padrão do apache: htdocs/ ou /var/www/).

No caso a pasta controllers, models e views estão dentro da pasta app(application, nome sugestivo). publico é onde vai suas outras coisas normais como imagens e css, js e assim por diante. E lib é a pasta onde vai ficar o ZF.

Entre na pasta onde você descompactou o arquivo tarball(.tar.gz), depois entre na pasta library e copie a pasta zend para a sua pasta lib(na ZF-tutorial) do seu sistema. Talvez você precise mudar(ou copiar) como root, aqui no exemplo vou usar sem o root.

Code (bash)
  1. cd ~/ZendFramework-1.0.1/library
  2. cp -Rfv Zend/ documentRoot_do_apache/ZF-tutorial/lib/

Aí depois no diretório lib irá ter lib/Zend, certo?

lib/Zend

Configurando o Apache

Primeira coisa que temos a fazer é abilitar o módulo rewrite do apache.
Edite o arquivo de configuração do apache, httpd.conf.
Descomente(tirando o #) a linha onde está escrito:

Code (apache)
  1. LoadModule rewrite_module modules/mod_rewrite.so
  2. AddModule mod_rewrite.c

Defina o AccessFileName (pode ser no final do arquivo):

Code (apache)
  1. AccessFileName .htaccess

Setar a opção AllowOverride como All.

Trocar as linhas abaixo:

Code (apache)
  1. #
  2. # Options Indexes FollowSymLinks
  3. # AllowOverride None
  4. #

por:

Code (apache)
  1. Options FollowSymLinks Includes
  2. AllowOverride All

Criando o Bootstrapping

O controller do ZF, Zend_Controller, é feito para suportar websites com urls limpas.
Então, todas as requisições precisam ser feitas diretamente em um arquivo index.php, essa prática é conhecida como bootstrapping.
E para isso precisamos criar alguns arquivos .htaccess.

ZF-tutorial/.htaccess

Code (apache)
  1. RewriteEngine on
  2. RewriteRule .* index.php
  3. php_flag magic_quotes_gpc off
  4. php_flag register_globals off

Essa RewriteRule quer dizer que para qualquer coisa escrita ele(apache) irá redirecionar para o index.php(que fica dentro do ZF-tutorial, calma que ainda vamos cria-lo). :)
Alí também setamos algumas configurações do PHP.ini. Essas configurações provavelmente já estão setadas como padrão, mas é bom ter certeza né. Elas só vão funcionar se estiver habilitado o mod_php no httpd.conf do apache.

Agora vamos setar nosso .htaccess na pasta público. Lá estará os arquivos JavaScript, CSS, imagens e assim por diante. Então vamos habilitar tudo por lá.

ZF-tutorial/publico/.htaccess

Code (apache)
  1. RewriteEngine off

Agora na pasta app e no lib não queremos que nenhum intruso acesse, porque lá estão nossos arquivos preciosos. :P
ZF-tutorial/app/.htaccess

Code (apache)
  1. deny from all

ZF-tutorial/lib/.htaccess

Code (apache)
  1. deny from all

Esse esquema de bootstrapping é recomendação dos desenvolvedores do ZF, ok? Motivo de segurança, sabe como é né.

Criando o nosso index.php(bootstrap file)

Agora vamos criar nossa index.php na pasta ZF-tutorial.
ZF-tutorial/index.php

Code (php)
  1. error_reporting(E_ALL|E_STRICT); // para mostrar os erros, apenas nos testes(precisa estar setado no PHP.ini)
  2. // Seta o timezone pra são paulo (>=PHP 5.1)
  3. setlocale (LC_ALL, ‘pt_BR’);
  4. date_default_timezone_set(‘America/Sao_Paulo’);
  5. /* Seta include path para o funcionamento correto do framework ***OBRIGATÓRIO*** */
  6. set_include_path(‘.’.PATH_SEPARATOR.‘./lib’
  7. .PATH_SEPARATOR.‘./app/models/’ //facilitar depois ao loadar as nossos modelos
  8. .PATH_SEPARATOR.get_include_path());
  9. /* Necessário para loadar qualquer outra classe do framework ***OBRIGATÓRIO*** */
  10. include "Zend/Loader.php";
  11. //loada o controller front
  12. Zend_Loader::loadClass(‘Zend_Controller_Front’);
  13. /*
  14. Essa classe se encontra em Zend/Controller/Front.php
  15. Pode ser loadado diretamente pelo nome se preferir
  16. Para começar nós precisamos loadar primeiro o front controller
  17. Ele faz um controle automático para detectar a base URL e fazer o redirecionamento correto
  18. */
  19. $controlador = Zend_Controller_Front::getInstance();
  20. $controlador->throwExceptions(true); // mostrar excessões(apenas para testes)
  21. $controlador->setControllerDirectory(‘./app/controllers’); // seta diretório com nossos controllers
  22. //Roda o sistema
  23. $controlador->dispatch();
  24. //sem fechar a tag php

Note que agente não fecha a tag php para nos previnir de erros usando o header(), no caso de espaços em branco adicionais depois do ?>.

Agora na pasta controllers vamos criar um IndexController.php. Esse controller vai entrar em ação sempre que o index for chamado.
Para entender como funciona, precisamos saber como o Zend_Controller_Front trabalha.
O ZF usa um sistema de Controllers(Controladores) e Actions(Ações). E isso é setado diretamente na url(lembra do bootstrapping?). Como?
Usando o nosso exemplo, no formato http://localhost/ZF-tutorial/index/teste o index é o Controller e o teste é o Action. Outro exemplo, http://localhost/ZF-tutorial/foo/bar o foo é o Controller e o bar é o Action.
E quando você não coloca nada? Exemplo, http://localhost/ZF-tutorial/ o Zend_Controller_Front considera como index o Controller e index a Action.
O que vem depois é parâmetro, mas isso é assunto pra depois :P

Vamos fazer nosso IndexController então
ZF-tutorial/app/controllers/IndexController.php

Code (php)
  1. class IndexController extends Zend_Controller_Action
  2. {
  3. public function indexAction()
  4. {
  5. $this->view->titulo = ‘Primeiro Tutorial de Zend Framework’;
  6. $this->view->detalhe = ‘Olá Mundo!’;
  7. }
  8. }