quinta-feira, 20 de agosto de 2009

Dump com FirePHP/FireBUG e Zend Framework

Esses dias que eu estava me atualizando na internet, me deparei com um artigo falando sobre o FirePHP, que até aquele momento me era desconhecido.
Para todos os desenvolvedores que trabalham com Javascript em especialmente Ajax, o Firebug do Firefox é uma ferramenta "ferrada" para o debug e dump das informações que foram criadas via Javascript.

E que tal termos algo parecido só que para o PHP? Seria legal, não é verdade? É exatamente isso que o FirePHP faz.

Eu não falarei exatamente sobre o FirePHP, mas falarei sim sobre como utilizálo no Zend Framework por meio das classes já existentes no nosso maravilhoso framework que é uma mão na roda!

Quem quiser saber mais sobre o FirePHP, aconselho ler o mesmo artigo que li no imasters:
http://imasters.uol.com.br/artigo/13959/php/_como_debugar_aplicacoes_ajaxphp_com_firephp/

E também indico o manual do Zend que fala sobre o FirePHP:
http://framework.zend.com/manual/en/zend.log.writers.html#zend.log.writers.firebug

É por isso que gosto do Zend, pela sua vasta documentação :)


CRIANDO AS INSTÂNCIAS NECESSÁRIAS

O FirePHP funciona como um log. Do mesmo jeito que criamos log por meio da classe Zend_Log. É o Zend_Log quem delega o log atual registrado para os "log writers" e o Zend_Log_Writer_FireBug é um componente writer que envia o log para o FirePHP.

Em seu bootstrap, antes de você dar um dispatcher em seu controller, insira as linhas abaixo:

$logger = new Zend_Log();
$writer = new Zend_Log_Writer_Firebug();

//DIZ AO LOG QUEM É O WRITER, OU SEJA, QUEM IRÁ GRAVAR OS LOGS
$logger->addWriter($writer);

Para utilizar seu log em todo o seu projeto, você pode manter uma instancia do seu Logger para toda a aplicação e usar em suas views, controllers e models:
Zend_Registry::set('logger',$logger);

Utilizando o Logger:
$logger = Zend_Registry::get('logger');
$logger->log('Mensagem de log para o FirePHP!', Zend_Log::INFO);

Repare na constante INFO da classe Zend_Log.
Toda vez que chamarmos um Log, no FireBug do firefox será mostrada um ícone de informação com a mensagem do primeiro parametro.
Você também pode utilizar as constantes WARN ou ALERT como referência de log ou prioridade das mensagens.

Um exemplo disso, é utilizarmos esse log em blocos Try catch.
Exemplo:
try {
// Caso tenha ocorrido algum erro
} catch(Exception $e) {
Zend_Registry::get('logger')->err($e)
}

ou também de outra forma:

try {
// Caso tenha ocorrido algum erro
} catch(Exception $e) {
$logger->log('Erro em bloco try catch ao tentar inserir dados na Base: '.$e, Zend_Log::ALERT);
}


DUMP DE INFORMAÇÕES PROCESSADAS NA BASE DE DADOS

Seria legal nós termos um dump de todas as operações que são feitas em nossa base de dados, não acha?
Mas seria um saco, cansativo e de grande manutenabilidade termos que chamar nosso log toda hora.

Mas..olha só como o Zend é camarada...rs
No seu bootstrap mesmo, insira as seguintes linhas de código depois de ter setado o seu Adapter e antes do dispatcher do seu controller:

$profiler = new Zend_Db_Profiler_Firebug('All DB Queries');
$profiler->setEnabled(true);
//$db SERIA O SEU ADAPTER CONFIGURADO PARA ACESSAR A BASE DE DADOS.
$db->setProfiler($profiler);

Com esse código, toda vez que for enviada uma instrução SQL para nossa base, o FirePHP nos mostrará os dados enviados para o servidor, parecido com a imagem abaixo:


DICAS

Em meu firebug, eu tive que habilitar a opção Rede (Última aba da janela do FireBug).
Não esqueça de habilitar o seu FirePHP.
Insira seu site na lista de (allowed Sites) do FirePHP
Seria chato se os usuários que acessam o site visualizassem todos os dumps que usamos para nos basear em tempo de produção, não é verdade?
Para não enviarmos mais o dump, não é necessário tirar todas as linhas de código dos nossos objetos. Basta fazer o seguinte:

$writer->setEnabled(false);
$profiler->setEnabled(false);

Espero que tenham gostado da matéria e por favor, enviem sugestões, criticas ou elogios.
Abraços.

segunda-feira, 3 de agosto de 2009

Upload de arquivos com Zend Framework - Parte 2

Pessoal,
Criei uma classe que utiliza o Zend_File para o upload de arquivos.
Como sempre tive problemas ao postar códigos nesse blog, tive novamente que dar um printscreen da tela...

Eu criei uma classe abstrata chamada Utils, onde implemento todos os métodos que utilizo frequentemente em meu projeto.
Os métodos que crio nessa classe são estáticos, pq não precisarei criar uma estância deles cada vez que eu for utilizá-los.
Eu criei um diretório chamado "classes" dentro de application. Basta adicionar o include_path desse diretório em seu bootstrap.

Essa classe faz upload de todos os campos do tipo file que tiver na página.
@UploadDir: Diretório para onde será encaminhado o arquivo
@renameFile: Caso deseja renomear os arquivos para que não haja overwrite, deixe este parâmetro como true. Caso contrário, o arquivo sofrerá overwrite.
@allowedFiles: Caso filtrar os tipos de arquivos à enviar, crie um array contendo os formatos permitidos.



Reparem que eu utilizei um método da própria classe, que serve para identificar a extensão do arquivo.
Segue abaixo o código desse método estático:
static function findexts($filename)
{
$filename = strtolower($filename) ;

$exts = split("[/\\.]", $filename) ;

$n = count($exts)-1;

$exts = $exts[$n];

return $exts;
}


Para chamar a classe em Seus controllers:



Caso você queira permitir todos os tipos de arquivos, basta não passar o 3º parâmetro para a classe.

Caso o nome dos arquivos sejam renomeados, o nome inicial do arquivo será o nome do input, por exemplo: foto_perfil....jpg
Para verificar se houve erro no envio de algum arquivo, você pode fazer o seguinte tratamento:
//LOOP EM CIMA DOS ARQUIVOS ENVIADOS
foreach($filesUploaded as $fileUploaded)
{
//HOUVE ERRO NO ARQUIVO?
if(!strpos($fileUploaded, 'Erro:')) {...}
}


Qualquer dúvida, fiquem avontade de incluir comentários.


Instead of reinventing the wheel, I use Frameworks. ZEND FRAMEWORK! ;)