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.2 (05/10/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
- Faça download dele no site oficial: http://framework.zend.com/download
- Descompacte o arquivo em qualquer pasta. Exemplo: tar zxvf ZendFramework-1.0.1.tar.gz -C ~/
Agora vamos arrumar a estrutura de diretórios necessária para o correto funcionamento do ZF.

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.
cd ~/ZendFramework-1.0.1/library cp -Rfv Zend/ documentRoot_do_apache/ZF-tutorial/lib/
Aí depois no diretório lib irá ter lib/Zend, certo?

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:
LoadModule rewrite_module modules/mod_rewrite.soDefina o AccessFileName (pode ser no final do arquivo):
AccessFileName .htaccessSetar a opção AllowOverride como All.
Trocar as linhas abaixo:
#<Directory /> # Options Indexes FollowSymLinks # AllowOverride None #</Directory>
por:
<directory> Options FollowSymLinks Includes AllowOverride All </directory>
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
RewriteEngine on RewriteRule .* index.php php_flag magic_quotes_gpc off 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
RewriteEngine off
Agora na pasta app e no lib não queremos que nenhum intruso acesse, porque lá estão nossos arquivos preciosos. ![]()
ZF-tutorial/app/.htaccess
deny from all
ZF-tutorial/lib/.htaccess
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
<?php error_reporting(E_ALL|E_STRICT); // para mostrar os erros, apenas nos testes(precisa estar setado no PHP.ini)// Seta o timezone pra são paulo (>=PHP 5.1) setlocale (LC_ALL, 'pt_BR'); date_default_timezone_set('America/Sao_Paulo');/* Seta include path para o funcionamento correto do framework ***OBRIGATÓRIO*** */ set_include_path('.'.PATH_SEPARATOR.'./lib' .PATH_SEPARATOR.'./app/models/' //facilitar depois ao loadar as nossos modelos .PATH_SEPARATOR.get_include_path()); /* Necessário para loadar qualquer outra classe do framework ***OBRIGATÓRIO*** */ include "Zend/Loader.php"; //loada o controller front Zend_Loader::loadClass('Zend_Controller_Front'); /* Essa classe se encontra em Zend/Controller/Front.php Pode ser loadado diretamente pelo nome se preferir Para começar nós precisamos loadar primeiro o front controller Ele faz um controle automático para detectar a base URL e fazer o redirecionamento correto */ $controlador = Zend_Controller_Front::getInstance(); $controlador->throwExceptions(true); // mostrar excessões(apenas para testes) $controlador->setControllerDirectory('./app/controllers'); // seta diretório com nossos controllers //Roda o sistema $controlador->dispatch(); //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
Vamos fazer nosso IndexController então
ZF-tutorial/app/controllers/IndexController.php
<?php class IndexController extends Zend_Controller_Action { public function indexAction() { $this->view->titulo = 'Primeiro Tutorial de Zend Framework'; $this->view->detalhe = 'Olá Mundo!'; } }
Atenção: Sempre o controller deve levar esse padrão NomeController.php e a classe com o mesmo nome do arquivo. A primeira letra sempre em maiúsculo e o resto minúsculo.
Já os Actions também deve levar esse padrão nomeAction(), sempre minúsculo.
Mas se você for rodar o sistema agora, vai perceber que vai dar uma excpetion gigantesca aí, certo?
Ela está falando que nós não temos o viewer para o index action do index controller.
Para criar, precisamos acessar a pasta scripts que está no ZF-tutorial/views/. Lá vamos criar uma pasta para cada Controller nosso, no nosso caso iremos criar uma pasta chamada index(por causa do IndexController). Todos os templates para o IndexController devem estar nessa pasta. O mais legal é que o nome do template leva o nome da action.
Calma, vou explicar: Por padrão cada action você pode ter um template ou não, mas se a action for tem um template para ela, então o template deve levar o mesmo nome da action. Por exemplo index.phtml(extenção do template) é o viewer do indexAction(), sacaram?
Na prática agora:
cd documentRoot_do_apache/ZF-tutorial/app/views/scripts mkdir index
Agora nós temos que criar o index.phtml
ZF-tutorial/app/views/scripts/index/index.phtml
<html> <head> <title><?php echo $this->escape($this->titulo); ?></title> </head> <body> <?php echo $this->escape($this->detalhe); ?> </body> </html>
é recomendável que usemos o escape para escapar tags html.
Agora vamos testar nossa aplicação.
Acesse o http://localhost/ZF-tutorial e depois tente http://localhost/ZF-tutorial/index/index
Você vai perceber que deu no mesmo.
Tarefinha, de leve
Agora deixo uma tarefa para vocês: Criar um zfAction(), no IndexController, com se respectivo viewer. Após criado, acessem http://localhost/ZF-tutorial/index/zf e vejam o que aconte!
Conclusões
Apesar desse tutorial mostrar de maneira simples como funciona o Zend Framework, podemos perceber como o Zend Frameowork é facil de usar e ao mesmo tempo é poderoso.
Para um maior aprendizado, irei postar um novo tutorial com muito mais recursos do ZF.
Por enquanto eu recomendo um tutorial muito bom(desenvolvedor do ZF), eu me baseei no tutorial dele, e tabmém usem bastante o manual.
Cya later!!


Comigo também não funcionou o this->escape recebendo acentuação, na variável detalhe.
Olá, Felipe,
Muito obrigado pelo tutorial!
Por mais que já está relativamente antigo, era exatamente o que eu estava procurando para configurar algumas coisas básicas.
ola galera sou JL sou programador pleno de php, e estou aqui para mostrar alguns trabalhos que estão sendo criado no zend acesse meu blog http://jlevolution.blogspot.com acesse meu site em flash beta 3 http://jlevolution.com
bom para fazer uma conexão com banco de dados no zend é muito pratico pois vc não precisa ficar dando include_once é só configurar o aplication.ini e o Bootstrap.php
exemplo:
aplication.ini
[production]
resources.db.adapter = "pdo_mysql"
resources.db.params.host = "localhost"
resources.db.params.username = "root"
resources.db.params.password = ""
resources.db.params.dbname = "site"
resources.db.params.charset = "utf8"
resources.db.isDefaultTableAdapter = true
lembrando como esta o seu index na pasta public se esta em production ou development
por padrão é production então cole o códido no bloco do production.
bom vamos ao Bootstrap.php
exemplo:
protected function _initConnection()
{
/**
* Obtém os resources(recursos).
*/
$options = $this->getOption('resources');
$db_adapter = $options['db']['adapter'];
$params = $options['db']['params'];
try{
/**
* Este método carrega dinamicamente a classe adptadora
* usando Zend_Loader::loadClass().
*/
$db = Zend_Db::factory($db_adapter, $params);
/**
* Este método retorna um objeto para a conexão representada por uma
* respectiva extensão de banco de dados.
*/
$db->getConnection();
// Registra a $db para que se torne acessível em toda app
$registry = Zend_Registry::getInstance();
$registry->set('db', $db);
}catch( Zend_Exception $e){
echo "Estamos sem conexão ao banco de dados neste momento. Tente mais tarde por favor.";
exit;
}
}
feito isso é só usar o banco de dados na nossa aplicação dessa maneira:
vc pode colocar esse código no controller ou na view
//seleciona o banco de dados que por defult é o site
$db = Zend_Db_Table::getDefaultAdapter ();
//pega tudo da tabela site_menu
$stmt = $db->query('SELECT * FROM site_menu');
while ($row = $stmt->fetch())
{
echo "{$row['menu_nome']}";
}
espero ter ajudado.