Escolar Documentos
Profissional Documentos
Cultura Documentos
Configurando o Apache!...........................................................9
Bootstrap!.............................................................10
Controladores!......................................................13
Modelos!................................................................14
Trabalhando com modelos e queries!...................................17
Layout e visões!...................................................20
Formulários!.........................................................23
Enviando arquivos!.................................................................26
Subforms !................................................................................30
Criando um CRUD!...............................................31
Desafio !....................................................................................34
Organizando a aplicação!....................................34
Roteamento!.........................................................37
Autenticação!........................................................38
Controle de acesso!.............................................42
Navegação!...........................................................47
Paginação!............................................................49
Cache!...................................................................52
Traduções!............................................................57
Enviando e-mails!.................................................59
Diagnóstico da aplicação!...................................63
Zend_log!..................................................................................63
Zend_Db_Profiler!....................................................................65
Conclusão!............................................................67
Introdução
https://gist.github.com/987319
http://framework.zend.com
Definindo o projeto
Na minha opinião a única forma de aprender uma nova
ferramenta, linguagem, sistema operacional, é quando você
realmente precisa resolver algum problema com ela. Pensando
nisso, esse livro é baseado na construção de um aplicativo: um
blog.
Mas um blog? Por alguns motivos:
• é um problema fácil de se entender. Todo mundo sabe como
um blog funciona, seus requisitos e funcionalidades. Então a
fase de requisitos do projeto é fácil de completar
• um blog apresenta um grande número de funcionalidades
comuns a vários outros sites, como módulos, controle de
acesso e permissões, upload de arquivos, tratamento de
formulários, cache, traduções, integração com serviços
externos, etc.
• a grande maioria dos frameworks possui um exemplo “como
desenvolver um blog usando X”, então fica mais fácil para
comparação se você já estudou algum outro framework
como CakePHP, CodeIgniter ou mesmo Ruby on Rails
Modelagem
USE blog;
https://gist.github.com/987325
Estrutura do projeto
Configurando o Apache
Vamos também configurar um VirtualHost no Apache para facilitar
os testes da aplicação. No arquivo httpd.conf (ou apache.conf)
adicionar o seguinte (procure no arquivo docs/README.txt do
projeto)
<VirtualHost *:80>
DocumentRoot "/caminho_htdocs/blog/public"
ServerName blog.local
<Directory "caminho_htdocs/blog/public">
AllowOverride All
Order allow,deny
</Directory>
</VirtualHost>
Bootstrap
<?php
/**
* Inicializa a sessão
*
* @return void
* @author Elton Minetto
*/
public function _initSession()
{
$session = new Zend_Session_Namespace('Blog');
Zend_Registry::set('session', $session);
}
/**
* Inicializa o banco de dados. Somente necessário se desejado
salvar a conexão no Registry
*
* @return void
* @author Elton Minetto
*/
public function _initDb()
{
$db = $this->getPluginResource('db')->getDbAdapter();
Zend_Db_Table::setDefaultAdapter($db);
Zend_Registry::set('db', $db);
}
}
https://gist.github.com/1449311
Nos próximos tópicos vamos adicionando ítens ao Bootstrap.
Um novo conceito apresentado no código acima é o
Zend_Registry. O registro é uma forma de armazenarmos objetos
ou variáveis para que estes estejam acessíveis em toda a
aplicação. É um mecanismo elegante para substituir o uso de
variáveis globais e o Zend Framework faz uso extenso dele.
Controladores
http://BASE_URL/modulo/controlador/action/parametro/valor/
Exemplos:
http://blog.local/index/show/id/1
http://blog.local/admin/index/show/id/1
application/controllers/IndexController.php
e
application/modules/admin/controllers/IndexController.php
https://gist.github.com/987343
e o conteúdo do segundo:
<?php
class Admin_IndexController extends Zend_Controller_Action {
public function showAction() {
}
}
https://gist.github.com/987345
Modelos
Antes de iniciarmos a criação dos controladores e das visões
precisamos criar a primeira camada da nossa aplicação MVC: os
modelos. Para isso deve-se criar um arquivo para cada tabela e
estes devem ser armazenados no diretório models. Todos os
modelos são classes PHP que extendem a classe
Zend_Db_Table_Abstract.
O primeiro passo é configurarmos nosso projeto para acessar o
banco de dados. Para isso vamos executar
zf configure dbadapter
"adapter=Pdo_Mysql&host=localhost&username=zend&password=zend&dbname=
blog"
Users.php
<?php
/**
* Modelo da tabela users
*
*/
class Application_Model_Users extends Zend_Db_Table_Abstract
{
// nome da tabela no banco de dados
protected $_name = 'users';
}
https://gist.github.com/987350
Posts.php
<?php
/**
* Modelo da tabela posts
*
*/
class Application_Model_Posts extends Zend_Db_Table_Abstract
{
protected $_name = 'posts';
protected $_dependentTables = array('Comments');
}
https://gist.github.com/987354
Comments.php
<?php
/**
* Modelo da tabela comments
*
*/
class Application_Model_Comments extends Zend_Db_Table_Abstract
{
protected $_name = 'comments';
protected $_referenceMap = array(
'Post' => array (
'columns' => array('post_id'),
'refTableClass' => 'Posts',
'refColumns' => array('id')
)
);
}
https://gist.github.com/987356
http://framework.zend.com/manual/en/zend.db.table.relationships.html
$db = Zend_Registry::get('db');
$select = new Zend_Db_Select($db);
Exemplos de uso
echo $select;
Layout e visões
No contexto de uma aplicação desenvolvida com o Zend
Framework, uma visão é uma porção de código que será
visualizada pelo usuário. HTML, CSS, JavaScript, imagens, etc.
É papel do controlador acessar e processar dados (como os
vindos da camada de modelo) e prepará-los para serem
visualizados pelo usuário, através da visão. Um arquivo de visão
nada mais é do que um arquivo PHP com a extensão .phtml e cuja
função básica é imprimir (usando echo por exemplo) os dados
enviados pelo controlador. No nosso exemplo, vamos analisar o
código do controlador IndexController, cujo conteúdo está no
arquivo
application/controllers/IndexController.php
<?php
class IndexController extends Zend_Controller_Action {
public function indexAction() {
//cria uma variável a ser mostrada na view
$this->view->msg = 'Hello!';
}
}
https://gist.github.com/987360
views/scripts/index/index.phtml
Seu conteúdo é:
<html>
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml;
charset=utf-8" />
<title>Blog</title>
</head>
<body>
<?php
//mensagens de erro
$session = Zend_Registry::get('session');
if(isset($session->erro))
echo "<p> $session->erro </p>";
unset($session->erro);
?>
//mostra o conteúdo da página
echo $this->layout()->content;
?>
</body>
</html>
https://gist.github.com/1473182
echo $this->layout()->content;
http://blog.local/
Uma observação. Se não especificarmos qual é o controlador na
URL o Bootstrap vai automaticamente procurar o controlador
IndexController e a action indexAction. Então acessar
http://blog.local
é equivalente a acessar
http://blog.local/index/index
Formulários
O Zend_Form é um componente que permite que formulários
sejam criados e mantidos usando-se objetos, aumentando
produtividade e mantendo um padrão de desenvolvimento. É
possível também com o Zend_Form, a implementação de
formulários com herança, ou seja, você tem um formulário
genérico (ex: Application_Form_Usuario) que pode ser utilizado
para criação de outros (ex: Application_Form_UsuarioAdmin) que
possuiriam apenas alguns campos adicionais além do form
padrão.
Ele também possui componentes que permitem a utilização de
todos os Filters e Validators do Zend, bem como a implementação
de Componentes personalizados.
Teremos inicialmente dois formulários, o de login e o de cadastro/
alteração de novos posts (que será usado pelo administrador).
Neste capítulo iremos definir e mostrar na visão os formulários,
deixando a lógica da manipulação dos mesmos para os tópicos
posteriores.
O arquivo forms/Login.php:
<?php
class Application_Form_Login extends Zend_Form
{
https://gist.github.com/1455143
<?php
https://gist.github.com/1335179
Enviando arquivos
<?php
//action e method
$this->setAction('/album')->setMethod('post');
$this->setAttrib('enctype', 'multipart/form-data');
}
}
https://gist.github.com/1468851
<?php
/**
* Album
*
* @package default
* @author Elton Minetto
**/
class AlbumController extends Zend_Controller_Action {
/**
* Album
*
* @return void
* @author Elton Minetto
**/
public function indexAction() {
$form = new Application_Form_Album;
//nome do arquivo
$name = $adapter->getFileName();
//tamanho
$size = $adapter->getFileSize();
//tipo
$mimeType = $adapter->getMimeType();
$fullFilePath = '/tmp/'.$renameFile;
$filterFileRename->filter($name);
}//se o formulário está inválido
else {
// Mostra os erros e popula o form com os dados
corretos
$form->populate($formData);
}
}
else {
//ainda não foi submetido dados
}
$this->view->form = $form;
}
}
https://gist.github.com/1468878
Herança de formulários
<?php
abstract class Application_Form_Pessoa extends Zend_Form {
public function init() {
$this->setName('Login');
$username = new Zend_Form_Element_Text('username');
$username->setLabel('Login')->setRequired(true)-
>addFilter('StripTags')->addValidator('NotEmpty');
$password = new Zend_Form_Element_Password('password');
$password->setLabel('Senha')->setRequired(true)-
>addFilter('StripTags')->addValidator('NotEmpty');
$this->addElements(array($username, $password));
}
https://gist.github.com/1468916
$this->addElements(array($matricula,$submit));
//action e method
$this->setAction('/index/index')->setMethod('post');
}
}
https://gist.github.com/1468943
<?php
class Application_Form_Professor extends Application_Form_Pessoa {
public function init() {
parent::init();
$disciplina = new Zend_Form_Element_Text('disciplina');
$disciplina->setLabel('Disciplina')->setRequired(true)-
>addFilter('StripTags')->addValidator('NotEmpty');
$submit = new Zend_Form_Element_Submit('submit');
$submit->setLabel('Entrar');
$submit->setAttrib('id', 'Entrar');
$this->addElements(array($disciplina,$submit));
//action e method
$this->setAction('/professor/index')->setMethod('post');
}
}
https://gist.github.com/1468947
Subforms
https://gist.github.com/987377
Criando um CRUD
Vamos agora usar o que aprendemos para criar o CRUD (Create,
Replace, Update, Delete) de um post.
O primeiro passo é criamos o controller PostController e as
actions. Para isso podemos usar os comandos:
E o arquivo views/scripts/post/retrieve.phtml:
<h1>Posts</h1>
<a href="/post/create">Adicionar</a>
<?php foreach($this->posts as $p) {?>
<h3><?php echo $p['title']; ?></h3>
<p><?php echo nl2br($p['description']); ?></p>
<p><a href="/post/update/id/<?php echo $p['id'];?>">Editar</
a></p>
<p><a href="/post/delete/id/<?php echo $p['id'];?>">Excluir</
a></p>
<?php } ?>
https://gist.github.com/1335234
http://blog.local/post
https://gist.github.com/1335245
E e o views/scripts/post/create/phtml:
https://gist.github.com/1335264
Desafio
Organizando a aplicação
Agora que já conhecemos alguns conceitos importantes do Zend
Framework vamos organizar melhor nossa aplicação. O primeiro
passo é pensarmos na estrutura dos nossos controllers e no fluxo
da aplicação:
IndexController:indexAction
Redirect
PostController:retrieveAction
Link
AuthController:indexAction
Redirect
PostController:retrieveAction
<?php
class Blog_Controller_Action extends Zend_Controller_Action
{
Roteamento
Roteamento é o processo de converter uma URL em uma ação a
ser executada. A rota default traduz URLs no formato citado
anteriormente. Rotas adicionais podem ser criadas, geralmente
para disponibilizar URLs mais fáceis de serem compreendidas ou
mais curtas. Por exemplo, poderíamos criar uma rota para que a
URL atualizar/142 fosse mapeada da mesma forma que post/
update/id/142.
;routes
resources.router.routes.update.route = /atualizar/:id
resources.router.routes.update.defaults.controller = post
resources.router.routes.update.defaults.action = update
resources.router.routes.excluir.route = /excluir/:id
resources.router.routes.excluir.defaults.controller = post
resources.router.routes.excluir.defaults.action = delete
/**
* Inicializa as rotas
*
* @return void
* @author Elton Minetto
*/
public function _initRoutes()
{
$updateRoute = new Zend_Controller_Router_Route(
'atualizar/:id',
array(
'controller' => 'post',
'action' => 'update'
)
);
$deleteRoute = new Zend_Controller_Router_Route(
'excluir/:id',
array(
'controller' => 'post',
'action' => 'delete'
)
);
$router = Zend_Controller_Front::getInstance()->getRouter();
$router->addRoute('updateRoute', $updateRoute);
$router->addRoute('deleteRoute', $deleteRoute);
}
https://gist.github.com/1469916
Autenticação
Nosso blog vai ter três tipos de usuários, o visitante normal, um
redator e um tipo especial, o administrador. Os administradores
podem adicionar novos posts no blog, alterá-los e excluí-los (o
CRUD de Post que fizemos no capítulo anterior). O redator vai
poder adicionar e alterar posts, mas não excluí-los.
Para isso precisamos determinar uma forma de identificar o
usuário, para sabermos se ele é válido, e no próximo tópico
iremos ver como controlar seu nível de acesso (administrador ou
redator). Iremos usar o formulário Application_Form_Login criado
anteriormente, em conjunto com um componente do framework
chamado Zend_Auth.
O Zend_Auth fornece uma API para autenticação e inclui
adaptadores para os cenários de uso mais comuns: LDAP, banco
de dados, HTTP, OpenID. E o desenvolvedor pode criar seus
próprios adaptadores extendendo os já existentes.
Vamos criar o AuthController usando o Zend Tool.
O código final:
<?php
https://
gist.github.com/
1449550
O Zend_Auth é simples de ser usado, como é possível ver no
código acima. Com poucas linhas é configurada a forma de
autenticação (com uma tabela do banco de dados) e faz-se a
validação. Caso a validação tenha ocorrido com sucesso as
credenciais do usuário são automaticamente armazenadas na
sessão. Também armazenamos na sessão a role do usuário, para
usarmos posteriormente.
Precisamos alterar o código da nossa visão, o arquivo views/
scripts/auth/index.phtml, adicionando o código abaixo:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=utf-8" />
</head>
<body>
<h2>Blog do Minetto</h2>
<?php
//mensagens de erro
$session = Zend_Registry::get('session');
if(isset($session->erro))
echo "<p> $session->erro </p>";
unset($session->erro);
?>
<?php echo $this->layout()->content; ?>
<?php
//usuario logado?
$auth = Zend_Auth::getInstance();
if ($auth->hasIdentity()) { ?>
<p><a href="/auth/logout">Sair</a></p>
<?php
}
else {
?>
<p><a href="/auth">Fazer login</a></p>
<?php
}
?>
<p>Copyleft @eminetto</p>
</body>
</html>
https://
gist.github.com/
1449567
Controle de acesso
Nós vimos anteriormente o uso do componente Zend_Auth. Este
componente é responsável apenas pela autenticação dos
usuários, sendo que ele não permite o controle de permissões aos
recursos do aplicativo. Esse papel é responsabilidade do
componente Zend_Acl. ACL (Access Control List - lista de controle
de acesso) é uma solução simples e flexível para realizar o
controle do acesso a determinados recursos.
Alguns conceitos são usados pelo Zend_Acl:
• papel (role): um grupo de usuários
• recurso (resource): algo a ser protegido
• privilégio (privilege): o tipo de acesso exigido
O primeiro passo é o planejamento dos ítens citados acima. No
nosso projeto, do blog, vamos usar três roles:
• visitante: pessoas que não fizeram o login no sistema
• redator: usuários que podem publicar e editar posts, mas
não apagá-los
• admin: usuários com todas as permissões de acesso
Vamos ter também três recursos a proteger:
• index: controlador IndexController
• post: controlador PostController
• auth: controlador AuthController
Os privilégios que iremos controlar são os métodos dos
controladores citados.
O primeiro passo é descrever os papéis, recursos e privilégios no
nosso arquivo de configuração, o application.ini:
;roles
acl.roles.visitante = null
acl.roles.redator = visitante
acl.roles.admin = redator
acl.resources[] = index
acl.resources[] = post
acl.resources[] = auth
;definir as acls no formato acl.permissao.role[] = controller.action
acl.allow.visitante[] = index.index
acl.allow.visitante[] = post.retrieve
acl.allow.visitante[] = auth.index
acl.allow.visitante[] = auth.logout
acl.allow.redator[] = post.create
acl.allow.redator[] = post.update
acl.allow.admin[] = post.delete
https://
gist.github.com/
1449742
<?php
class Blog_Controller_Action extends Zend_Controller_Action
{
public function init()
{
$session = Zend_Registry::get('session');
//verifica ACL
if(Zend_Registry::isRegistered('acl')) {
$request = $this->getRequest();
//pega o nome do modulo, controlador e action
$controller = $request->getControllerName();
$action = $request->getActionName();
$auth = Zend_Auth::getInstance();
//se o usuário fez login usa a role que está na
sessão
if($auth->hasIdentity()) {
$role = $session->role;
}
else {
$role = 'visitante';
}
//faz a verificação da permissão
$acl = Zend_Registry::get('acl');
if(!$acl->isAllowed($role, $resource, $privilege))
{
$session->erro = 'ACL inválida';
$this->_redirect('/');
}
}
}
}
https://
gist.github.com/
1449759
https://
gist.github.com/
987391
https://
gist.github.com/
1449791
Zend_Registry::set('Zend_Navigation', $container);
}
https://
gist.github.com/
1449909
Zend_Layout::getMvcInstance()
->getView()
->navigation()
->setAcl($acl)
->setRole($role);
Paginação
Usando o componente Zend_Paginator facilita uma das
necessidades mais comuns em aplicações web, a paginação de
dados.
O componente Zend_Paginator possibilita ao programador
configurar uma série de opções afim de tornar a paginação mais
intuitiva. Atualmente o Zend_Paginator nos permite paginar quatro
tipos de dados:
• Array
• DbSelect
• DbTableSelect
• Iterator
Vamos modificar nosso sistema de blog para que ele use
paginação na página inicial.
Primeiro vamos fazer uma alteração no método retrieveAction() do
PostController.php. Vamos comentar a linha:
$result = $posts->fetchAll(); //pega todos os posts
e adicionar as seguintes:
//criando a paginaçao
Zend_Paginator::setDefaultScrollingStyle('Sliding');
Zend_View_Helper_PaginationControl::setDefaultViewPartial('partials/
paginator.phtml');
//manda o paginador usar os dados vindos do banco
$paginator = Zend_Paginator::factory($posts->fetchAll());
https://
gist.github.com/
987415
https://
gist.github.com/
987416
https://
gist.github.com/
1469762
Cache
A técnica de cache é muito usada para melhorar a performance de
sites, sejam eles de grande tráfego ou não.
Teoricamente quase tudo pode ser armazenado em cache:
resultados de consultas, imagens, arquivos css, arquivos js,
trechos de código html, etc.
No Zend Framework o cache é fornecido usando-se a classe
Zend_Cache. O cacheamento é fornecido ao programador através
de “frontends”, enquanto que o armazenamento em si é feito com
classes de “backends”. Isso torna o processo flexível no quesito
armazenamento e fácil para a manipulação.
O frontend mais usado é o Core, padrão do Framework. Este pode
ser extendido para atender as necessidades do usuário, mas na
maioria das vezes isso não é necessário.
Os principais backends disponíveis são:
• File: os dados do cache são armazenados em arquivos no
sistema operacional
• Sqlite: salvos em um banco de dados Sqlite
• Memcached: os dados serão salvos no Memcached, um
servidor específico para cache, usado por grandes
arquiteturas como o Facebook
• Apc: usa o cache em memória fornecido pela extensão APC
(Alternative PHP Cache) do PHP
• Xcache: usa a extensão do PHP, Xcache para armazenar os
dados em memória
• ZendPlatform: usa a solução proprietária da Zend para
armazenar o cache
Vamos ver alguns exemplos de uso. O primeiro passo é criarmos
entradas no nosso arquivo de configurações, no application.ini:
;cache
cache.compression = true
cache.frontend.lifetime = 7200
cache.frontend.automatic_serialization = true
cache.backend.adapter = File
;cache em memcached
;cache.backend.options.srv1.host = localhost
;cache.backend.options.srv1.port = 11211
;cache.backend.options.srv1.persistent = true
;cache em arquivo
cache.backend.options.cache_dir = "/tmp"
https://
gist.github.com/
1469557
/**
* Inicializa o cache
*
* @return void
* @author Elton Minetto
*/
public function _initCache()
{
$config = Zend_Registry::get('config')->cache;
$frontendOptions = array(
'lifetime' => $config->frontend->lifetime, // tempo de vida
'automatic_serialization' => $config->frontend-
>automatic_serialization
);
$backendOptions = $config->backend->options->toArray();
https://
gist.github.com/
1469560
$cache = Zend_Registry::get('cache');
//busca os posts
$posts = new Application_Model_Posts; //cria um novo objeto Posts
//verifica se já está no cache o resultado
if(!$result = $cache->load('cachePosts')) {
//não existe no cache, processar e salvar
$result = $posts->fetchAll();//pega todos os posts
$cache->save($result, 'cachePosts');
}
$this->view->data = $result;
https://
gist.github.com/
1469573
https://
gist.github.com/
1469589
https://
gist.github.com/
987409
https://
gist.github.com/
1469654
Traduções
Nos exemplos anteriores vimos a utilização dos validadores do
Zend Framework para verificar se os campos obrigatórios de um
formulário foram digitados ou se possuíam valores corretos. Mas
as mensagens de erro e validação são apresentadas por padrão
na língua inglesa. Para facilitar o uso das mensagens em outras
línguas vamos usar o componente Zend_Translate.
Para fazer uso do componente vamos inicialmente criar um
diretório no projeto onde iremos armazenar os arquivos das
traduções. Vamos chamar este diretório de application/languages.
Vamos adicionar as linhas abaixo no application.ini:
resources.locale.default = "pt_BR"
resources.translate.adapter = "csv"
resources.translate.data = APPLICATION_PATH "/languages"
/**
* Inicializa o translate
*
* @return void
* @author Elton Minetto
*/
public function _initTranslate()
{
$config = Zend_Registry::get('config');
$translate = $config->resources->translate;
$locale = $config->resources->locale;
$zend_translate = new Zend_Translate($translate->adapter,
$translate->data, $locale->default);
Zend_Registry::set('Zend_Translate', $zend_translate);
}
http://framework.zend.com/manual/en/zend.validate.messages.html
<h2>
<?php echo Zend_Registry::get('Zend_Translate')->_('Novo Post');?>
</h2>
Caso esta linha não exista o texto ‘Novo Post’ será apresentado,
caso contrário irá apresentar o texto ‘New post’.
Usando o Zend_Translate é muito fácil criar aplicativos para
múltiplas línguas.
Enviando e-mails
Enviar e-mails é uma função recorrente em diversos tipos de
aplicação Web. Neste tópico é apresentado um controlador com
alguns exemplos de como enviar e-mails usando o componente
Zend_Mail.
<?php
class EmailController extends Zend_Controller_Action {
//configuração do exemplo
private $smtp = 'smtp.gmail.com';
private $conta = 'eminetto@gmail.com';
private $senha = 'senha';
private $de = 'eminetto@gmail.com';
private $para = 'eminetto@coderockr.com';
//envio de e-mail texto
public function indexAction() {
$assunto = "Teste de envio de email ";
$mensagem = "Isso é apenas um teste de envio
utilizando o Zend_Mail().";
try {
$config = array (
'auth' => 'login',
'username' => $this->conta,
'password' => $this->senha,
'ssl' => 'ssl',
'port' => '465'
);
try {
$config = array (
'auth' => 'login',
'username' => $this->conta,
'password' => $this->senha,
'ssl' => 'ssl',
'port' => '465'
);
/**
* Recebe os campos do formulário
*/
$arqTmp = $_FILES["file"]["tmp_name"];
$arqName =$_FILES["file"]["name"];
$arqType = $_FILES["file"]["type"];
$assunto = "Teste de envio de email com
Anexo";
$mensagem = "Isso é apenas um teste de envio
utilizando o <b>Zend_Mail()</b>.<br><br>Até mais, <br>Elton
Minetto<br><i>Coderockr</i>";
try {
$config = array (
'auth' => 'login',
'username' => $this->conta,
'password' => $this->senha,
'ssl' => 'ssl',
'port' => '465'
);
$mailTransport = new
Zend_Mail_Transport_Smtp($this->smtp, $config);
https://
gist.github.com/
987420
https://
gist.github.com/
987421
Zend_log
/**
* inicializa o log
*
* @return void
* @author Elton Minetto
**/
public function _initLog()
{
$writer = new Zend_Log_Writer_Stream('/tmp/zf_log.txt');
$log = new Zend_Log($writer);
Zend_Registry::set('log', $log);
}
Zend_L Emergê
og::EM ncia:
ERG sistema
não
pode
ser
usado
Zend_L Alerta:
og::AL ação
ERT deve
ser
tomada
Zend_L Crítico
og::CRI
T
Zend_L Erro
og::ER
R
Zend_L Aviso
og::WA
RN
Zend_L Observ
og::NO ações
TICE
Zend_L Informa
og::INF tivo
O
Zend_L Mensa
og::DE gens
BUG de
debug
Zend_Db_Profiler
Conclusão
Certamente não consegui aqui englobar todas as funcionalidades
do Zend Framework, mas esse não era exatamente o objetivo
deste livro. A idéia aqui era apresentar as principais características
e como usá-las em uma aplicação comum e espero ter atingido
esse modesto objetivo.
Uma das vantagens de ser um e-book é que esse livro pode ser
“vivo”, coisa que é mais difícil para um livro impresso. Todos os
trechos de códigos do PDF possuem links para uma versão
online, o que facilita a cópia para o seu editor de programação
favorito, mas que principalmente facilita alguma possível correção
que venha a acontecer. Então acompanhe o site oficial deste livro,
o http://www.zfnapratica.com.br para acompanhar qualquer
melhoria ou correção nos códigos ou textos. E caso tenha alguma
sugestão ficaria feliz em recebê-la e publicar no site. Meus dados
de contato estão na introdução deste livro.
É isso. Happy coding para você!