Colocando o site/aplicação em manutenção com o Zend Framework
Olá!
Hoje vamos falar sobre algo que é bem simples de fazer, mas ao mesmo tempo é bastante útil. De vez em quando precisamos fazer alguma manutenção em nosso site/aplicação após a mesma estar online, ou seja, em produção. Como fazer para que, durante o período de manutenção, quem visitar o site veja uma tela de manutenção, mas você (que está logado como admin) possa acessar tanto o site quanto o painel de administração?
Simples. Criaremos um plugin que vai fazer esta verificação. Como o objetivo do artigo não é ensinar a criar plugin, vamos direto ao código. Crie um arquivo de nome Manutencao.php e coloque ele na pasta /library/App/Plugin/, ficando /library/App/Plugin/Manutencao.php, com o conteúdo abaixo.
<?php
/**
* Plugin que deixa o site/aplicação em manutenção.
*
* @author Matias Rezende - http://matiasrezende.com.br
* @version 1.0
*/
class App_Plugin_Manutencao extends Zend_Controller_Plugin_Abstract {
/**
* @see Zend_Controller_Plugin_Abstract::preDispatch()
*/
public function preDispatch ( Zend_Controller_Request_Abstract $request ) {
// assumindo que default é o nome do módulo visível do site
if ( ! Zend_Auth::getInstance ()->hasIdentity () && $request->getModuleName () == 'default' ) {
$request->setControllerName ( 'manutencao' )
->setActionName ( 'index' );
}
}
}
O que ele faz. Se ao acessar não tiver usuário logado e o módulo acessado for o módulo default, ele manda para o controller de manutenção, action index. Caso tenha usuário logado ou caso o módulo a ser acessado não seja o default (para permitir que se faça login, por exemplo), ele não faz nada.
Obs.: Apenas estamos verificando se o usuário está logado, mas isto pode ser (é) um problema. O ideal é que se faça a verificação de permissão (Acl), mas isto fica para um outro artigo.
Adicionando o plugin
Para que o plugin seja chamado, precisamos dizer para o ZF fazer isto. Podemos fazer via Boostrap.php ou via application.ini. Para o exemplo aqui, vamos fazer pelo application.ini, adicionando a linha abaixo:
resources.frontController.plugins.Manutencao = "App_Plugin_Manutencao"
Uhn… Mas peraí. Desta forma, ele vai fazer esta verificação SEMPRE. Mas não é isto que queremos. Só queremos que ele faça isto QUANDO estivermos em manutenção. Como resolver?
Usando ambientes no application.ini
Quem já leu o artigo Trabalhando com ambientes no application.ini do Zend Framework já sacou como fazer para funcionar. Em resumo, vimos que podemos criar ambientes para a aplicação. O que vamos fazer? Incluir este plugin dentro do ambiente manutencao, que vamos criar. Nosso application.ini ficará assim:
[production] // todas as nossas configurações normais [manutencao : production] resources.frontController.plugins.Manutencao = "App_Plugin_Manutencao"
Agora o plugin só será adicionado quando estivermos no ambiente manutencao. Para trocar o ambiente da aplicação, temos algumas formas (como vimos no artigo). A que eu mais gosto é via arquivo .htaccess.
SetEnv APPLICATION_ENV manutencao
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
E pronto!! Com isto, temos uma forma simples de colocar o sistema em manutenção para todos, menos para o usuário logado.
Abraços e até a próxima!!


