20 out2011

Colocando o site/aplicação em manutenção com o Zend Framework

por Matias Rezende

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!!

Deixe um Comentário

O seu endereço de email não será publicado Campos obrigatórios são marcados *

*

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>