Diferentes estratégias de log utilizando Strategy Pattern com PHP

Se você já desenvolveu qualquer tipo de aplicação já deve ter sentido a necessidade de registrar logs, seja para rastrear algum tipo de erro ou para saber se a aplicação está realizando os processos corretamente, principalmente se a aplicação rodar como um serviço ou em plano de fundo.

Existem diferentes estratégias para registrar logs, acredito que o método mais comum seja registrar em um arquivo de texto, porém você pode querer registrar no console, em um banco de dados ou até mesmo utilizar algum serviço externo como o Sentry. Você pode inclusive utilizar várias estratégias ao mesmo tempo em uma mesma aplicação.

Uma das soluções nessa situação é desenvolver uma biblioteca de log utilizando o padrão de projeto Strategy Pattern para lidar com essas diferentes estratégias. Neste artigo vou apresentar desde um exemplo mais simples até um exemplo utilizando Strategy Pattern para registro de logs.

Código fonte disponível em: https://github.com/rafaelcouto/diferentes-estrategias-de-log-utilizando-strategy-pattern-com-php

Criando aplicação web para vários clientes em bancos separados com Laravel

É muito comum ao criar uma aplicação web que tenhamos a intenção de liberá-la como um serviço, ou seja, o cliente irá pagar um valor periódico (mensal, semestral, etc.) pelos serviços que o software disponibiliza e não pelo software em si, isso é comumente conhecido como SaaS (Software as a service). Porém, com isso vem o desafio de gerenciar e distribuir a aplicação para esses clientes.

Um conceito muito conhecido nessa situação é o Multi Tenancy (ou Multi Tenant), ou seja, a aplicação é alugada por vários clientes e cada cliente é um inquilino (tenant). Basicamente, há duas formas de aplicar o Multi Tenancy, com banco de dados compartilhado (Single Database) e com banco de dados separado (Multi Database), cada uma possui suas vantagens e desvantagens.

Neste artigo veremos como implementar a forma com banco de dados separado. Para isso, iremos criar uma aplicação com Laravel em que cada inquilino irá acessar a aplicação através de um subdomínio próprio e através desse subdomínio iremos fazer a conexão no banco de dados específico dele. Além disso, iremos criar comandos para facilitar a criação de um novo inquilino e também para atualizar a estrutura do banco de dados.

Animação 1 – Resultado final

Código fonte disponível em: https://github.com/rafaelcouto/criando-aplicacao-web-para-varios-clientes-em-bancos-separados-com-laravel

Integrando aplicação web com dispositivo local

As aplicações web são cada vez mais comuns no nosso cotidiano, pois elas oferecem diversas vantagens se comparadas com as aplicações desktop, como portabilidade, facilidade de atualização, escalabilidade, etc. Porém, como uma aplicação web roda diretamente no navegador do usuário, ficamos limitados aos recursos que ele nos disponibiliza e também às suas restrições.

Vamos supor que nós desenvolvemos uma aplicação web de vendas para um estabelecimento comercial. Em um determinado momento essa aplicação precisará emitir cupom fiscal para os clientes e, no caso de São Paulo, será necessário um dispositivo SAT para a emissão dessas notas. A comunicação com o dispositivo SAT é feita através de uma DLL (no caso do Windows), porém como fazemos para que nossa aplicação web se comunique com esse dispositivo, visto que ele está instalado localmente no computador do usuário e o navegador não permite acessá-lo diretamente?

Algumas soluções que podemos pensar são:

  • Criar uma aplicação desktop que funcione como um servidor web local na máquina do usuário e então a aplicação web se comunica com essa aplicação desktop utilizando o protocolo HTTP que então se comunica com o dispositivo local;
  • Criar uma extensão para o navegador, assim a aplicação web irá se comunicar com a extensão através do protocolo Messaging, a extensão irá se comunicar com uma aplicação desktop através do protocolo Native Messaging que então se comunica com o dispositivo local;
  • Criar uma aplicação desktop que fique verificando em um intervalo predeterminado se há notas para serem emitidas através de uma API disponibilizada pela aplicação web.

Neste artigo vamos implementar a primeira solução. Para isso, iremos desenvolver uma aplicação web simples e uma aplicação desktop que irá funcionar como um servidor web local que fará a ponte entre a aplicação web e um dispositivo SAT.

Código fonte disponível em: https://github.com/rafaelcouto/integrando-aplicacao-web-com-dispositivo-local.

Simple Factory com PHP

O Simple Factory é uma técnica que nos auxilia na criação de objetos, evitando a repetição de código e facilitando à adição de código novo. Diferente do padrão Factory e Abstract Factory, o Simple Factory não é considerado um Design Pattern, porém é uma técnica muito útil em diversas situações.

A maioria dos artigos que vemos por ai possuem exemplos muito abstratos, utilizando animais ou carros. Neste artigo pretendo trazer um exemplo mais próximo do mundo real.

Se você já trabalhou em alguma aplicação com área financeira já deve ter precisado implementar a geração de boletos. Apesar de haver uma certa padronização, cada banco implementa o boleto com suas particularidades, principalmente na geração do Nosso Número, que é o número de controle do boleto no banco.

Neste artigo, veremos desde um exemplo mais simples sem orientação à objetos até o exemplo utilizando o Simple Factory, para a geração do Nosso Número do boleto.

Código fonte disponível em: https://github.com/rafaelcouto/simple-factory-com-php.

Utilizando múltiplas versões do PHP no Windows com Laragon

Quem trabalha com várias aplicações PHP ao mesmo tempo, sabe que muitas vezes a versão do PHP é diferente de uma aplicação para outra e que as vezes há problemas de compatibilidade entre uma versão e outra.

No Windows é muito comum utilizarmos o XAMPP ou WAMP para desenvolver localmente. Eles são ótimos caso você trabalhe com uma única versão do PHP, porém são muito “engessados”. Caso você precise de outra versão do Apache, MySQL e PHP, terá que instalar outra versão do programa.

Neste artigo, pretendo apresentar o Laragon, que tem uma proposta um pouco diferente do XAMPP e do WAMP. Com ele é possível escolhermos o que queremos instalar e trocar as versões sem muito esforço, além de vários recursos que facilitam nossa vida de desenvolvedor web.

Animação 1 – Troca de versão do PHP com Laragon

Automatizando atualização de aplicação com Git

Se você tem uma aplicação sendo versionada com Git, acredito que já tenha sentido a necessidade de automatizar o processo de atualização dessa aplicação, ao invés de ter que atualizar os arquivos manualmente ou então ter que logar no servidor via SSH para rodar um git pull toda vez que houver uma atualização.

E se assim que você fizesse a atualização local, desse um git push origin para atualizar o repositório remoto (no Github, por exemplo) e depois desse apenas um git push servidor para atualizar a aplicação em produção, seria muito mais simples certo?

Neste artigo, pretendo mostrar uma forma para automatizar o processo de atualização de uma aplicação, utilizando Git Hooks. Os exemplos mostrados nesse artigo foram testados no Ubuntu 16.04.

Animação 1 – Demonstração do procedimento de atualização

Configurar subdomínio HTTPS com Apache no Ubuntu

Muitas vezes você contrata um VPS (Virtual Private Server) e coloca uma aplicação lá para rodar. Pode ser que essa aplicação comece a crescer e você precisa criar novos módulos ou então decide adicionar novas aplicações, eis então que surge a necessidade da configuração de subdomínios.

Nesse artigo, vou descrever como foi minha experiência ao configurar um subdomínio HTTPS e veremos todos os passos para fazer a configuração. Todo o processo realizado neste artigo foi feito no Apache 2.4 rodando no Ubuntu 16.04.

Backup na nuvem com Dropbox e PHP [API v2]

Vamos supor que você tenha um sistema que armazene documentos dos usuários em uma pasta no seu servidor, porém para manter uma estrutura mais organizada, você separa os documentos em sub-pastas de acordo com o ano. Normalmente você se preocupa em fazer backup do banco de dados, porém e os arquivos desta pasta?

É indiscutível que em qualquer sistema online que armazene arquivos no servidor possua uma estrutura de backup. Uma opção interessante é manter uma cópia desses arquivos em algum serviço de armazenamento na nuvem. Hoje em dia temos diversos serviços desse tipo, porém falaremos especificamente do Dropbox neste artigo.

Veremos neste artigo como copiar uma pasta que está no servidor para uma pasta no Dropbox de forma recursiva, ou seja, copiando todos os arquivos da pasta e de suas sub-pastas.

Chat simples utilizando Websocket, Vue.JS e PHP

O Websocket  é um protocolo que nos permite abrir uma comunicação bidirecional com o servidor utilizando um único soquete TCP (Transmission Control Protocol) através do navegador. Sendo assim, tanto o cliente quanto o servidor podem enviar informações entre si a qualquer momento. Neste artigo, veremos como implementar um simples aplicativo de chat utilizando este protocolo.

No lado cliente utilizaremos o Vue.JS para facilitar a construção da interface do chat, além de manter um código mais organizado.

No lado servidor utilizaremos o Ratchet que é uma biblioteca PHP que nos permite construir um servidor de Websocket de um jeito descomplicado.

Confira o exemplo em funcionamento, clicando aqui.

Menu dinâmico com submenus infinitos utilizando AngularJS e PHP

Neste artigo veremos uma maneira de construir um menu dinâmico, ou seja, no cadastro do menu será definido o menu superior e através de um método recursivo construiremos o menu completo hierarquicamente, permitindo um número “infinito” de submenus.

No lado servidor iremos utilizar PHP para buscar os menus no banco de dados e organizá-los em um vetor de forma hierárquica.

No lado cliente iremos utilizar AngularJS para construir o menu visualmente com base nos dados retornados pelo servidor.

Imagem 1 – Resultado final

Consulta dinâmica com paginação utilizando AngularJS e PHP

Neste artigo pretendo mostrar como fazer uma consulta de registros completamente dinâmica, ou seja, sem a necessidade de recarregar a página para filtrar ou paginar os registros. Utilizaremos como exemplo uma simples consulta de clientes onde o usuário poderá filtrá-los e navegar entre as páginas.

No lado cliente iremos utilizar o AngularJS para facilitar a comunicação com o servidor, além de manter um código mais organizado e reutilizável. Atualmente já temos o Angular 2, porém ainda gosto da simplicidade do AngularJS e acredito que se encaixa melhor no propósito deste artigo.

No lado servidor iremos apenas utilizar uma biblioteca de Query Builder para montarmos nossa query de consulta com o banco de dados. Hoje em dia é muito comum a utilização de um Query Builder em frameworks e no nosso caso vai facilitar muito a paginação dos registros.

Confira o exemplo em funcionamento, clicando aqui.

Backup do banco de dados MySQL com PHP

Hoje em dia temos diversas ferramentas para gerar backup de um banco de dados MySQL. Podemos gerar manualmente através do phpMyAdmin ou então por linha de comando utilizando o mysqldump, por exemplo.

Se o seu projeto estiver hospedado em uma hospedagem compartilhada, você provavelmente não tem acesso a linha de comando, e suas opções para automatizar o processo de backup ficam limitadas.

Neste artigo vou apresentar uma forma de fazer o backup com PHP, utilizando uma biblioteca que gera o backup completo do banco de dados sem precisar de nenhuma dependência. Além disso vamos implementar um método para apagar os backups antigos, mantendo apenas uma quantidade X de backups.

Backup na nuvem com Dropbox e PHP

[Update 01/05/2020]
A versão 1 da API do Dropbox utilizada por esse artigo esta obsoleta. Veja a versão deste artigo utilizando a versão 2 da API, clicando aqui.

Vamos supor que você tenha um sistema que armazene documentos dos usuários em uma pasta no seu servidor, porém para manter uma estrutura mais organizada, você separa os documentos em sub-pastas de acordo com o ano. Normalmente você se preocupa em fazer backup do banco de dados, porém e os arquivos desta pasta?

É indiscutível que em qualquer sistema online que armazene arquivos no servidor possua uma estrutura de backup. Uma opção interessante é manter uma cópia desses arquivos em algum serviço de armazenamento na nuvem. Hoje em dia temos diversos serviços desse tipo, porém falaremos especificamente do Dropbox neste artigo.

Veremos neste artigo como copiar uma pasta que está no servidor para uma pasta no Dropbox de forma recursiva, ou seja, copiando todos os arquivos da pasta e de suas sub-pastas.

Uma breve introdução ao Composer

Vamos supor que você está trabalhando em um projeto PHP e em algum momento você precisa de uma biblioteca para manipulação de strings. Para não reinventar a roda, você decide procurar alguma biblioteca pronta na internet. Você acha uma biblioteca X com os recursos que você precisa e então baixa ela para utilizar em seu projeto. Porém, ao rodar o projeto, descobre que a biblioteca X dependente da biblioteca Y. Sem escolha, você baixa a biblioteca Y e então descobre que ela depende da biblioteca Z; e assim por diante.

É neste inferno de dependências que entra o Composer para nos ajudar. O Composer é uma ferramenta para gerenciar dependências em um projeto PHP. Basta você definir quais bibliotecas que o seu projeto dependente e o Composer vai fazer o trabalho de baixar e atualizar elas e suas dependências.

Redimensionar imagem antes de enviar com Javascript

Normalmente, quando fazemos o upload de uma imagem nós precisamos redimensiona-lá para reduzir seu tamanho. Esse processo normalmente é feito do lado servidor, ou seja, enviamos a imagem na sua forma e tamanho original e então redimensionamos no servidor utilizando PHP, por exemplo.

Porém, em um aplicativo de galeria de fotos, por exemplo, o usuário normalmente baixa as fotos (em alta resolução) de sua câmera e quer em seguida enviar para o aplicativo. Supondo que ele deseja enviar 200 fotos, cada uma com 5 MB, seria necessário fazer o upload de 1 GB de dados para o servidor, para que então possamos reduzi-las em um tamanho viável.

Sendo assim, pretendo apresentar nesse artigo uma solução para este problema. Vamos ver como redimensionar a imagem antes de enviar ao servidor, utilizando Javascript. Para isso faremos um formulário para envio de várias imagens que serão salvas em uma pasta no servidor.

Confira o exemplo em funcionamento, clicando aqui.