anúncios

segunda-feira, 25 de setembro de 2017

Automatizando e versionalizando as tabelas do banco de dados com Phinx

O que é Phinx ?

É uma ferramenta para escrever e executar migrations, usada inclusive pelo plugin de migrations do framework CakePHP. Atualmente os frameworks PHP populares possui recurso de migrations incluso, mas caso você esteja em um projeto que não utilize nenhum framework PHP e precisa de uma forma organizada e atualizada de controlar as alterações na base de dados, nesse caso o Phinx pode ajudar.

SGBD suportados
O Phinx suporte aos SGBDs: MySQL, PostgreSQL, SQLite, SQL Server
  • MySQL: use mysql adapter.
  • PostgreSQL: use pgsql adapter.
  • SQLite: use sqlite adapter.
  • SQL Server: use sqlsrv adapter.
Instalação do Composer
Para instalar o Phinx, precisa instalar o Composer que pode ser obtido no site https://getcomposer.org/
Windows: Após fazer o download do executável, execute e segue Next, Next e Finish

Linux
Debian:
# apt-get install curl

CentOS:
# yum install curl

Download do Composer
# curl -sS https://getcomposer.org/installer | php
Setar permissão de execução
$ chmod +x composer.phar
Mover para o diretório local
# mv composer.phar /usr/local/bin/composer

Instalação do Phinx
No diretório do projeto, execute
$ composer require robmorgan/phinx

Execute o comando seguinte para gerar o arquivo phinx.yml
$ vendor/bin/phinx init .

O arquivo phinx.yml é onde armazena as informações do banco de dados, vem montado base de produção, desenvolvimento e testes, cabe preencher as credencias do banco de dados.
Na configuração default_database define o ambiente da base default, por boas práticas, coloca-se development como default.

Assim ao executar o migrate não precisa especificar o argumento. Para atualizar a base de testes e produção, faça:
$ vendor/bin/phinx migrate -e testing
$ vendor/bin/phinx migrate -e production

Para cada tabela nova e/ou alterações na tabela já existente deve criar um migrate com o padrão CamelCase.
Estando no diretório onde instalou o phinx, o comando para criar uma migration é: vendor/bin/phinx create NomeDaMigrationCorrespondente
Com isso, irá gerar um arquivo template no diretório db/migrations com o nome da migration incluindo timestamp no nome do arquivo criado. É nesse arquivo que irá criar a tabelas e os campos. Veja o arquivo de exemplo para se basear. Após a implementação do arquivo da migrations correspondente, pode executar o comando para criar a migrations no banco, com o comando vendor/bin/phinx migrate

Tipos das colunas inclusos nas migrations (tabelas)
  • biginteger
  • integer
  • boolean
  • date
  • datetime
  • decimal
  • float
  • string
  • text
  • time
  • timestamp
  • uuid

Criar uma migration para uma tabela correspondente
$ vendor/bin/phinx create NomeDaMigrationCorrespondente
Irá gerar o arquivo correspondente ao nome da migration com timestamp no diretório db/migrations

Implementar a migration criada
Edita o arquivo db/migrations/< TIMESTAMP_nome_migration_criada >.php
Para uma nova tabela, coloca no método up() e no final aplica com o método save().
Para alteração de uma tabela já existente, coloca no método change() e no final aplica com o método update().
Nova tabela
public function up()
{
$nome_tabela = $this->table('nome_tabela');
$nome_tabela->addColumn('nome', 'string', array('limit' => 100))
->addColumn('sobrenome', 'string', array('limit' => 100))
->addColumn('email', 'string', array('limit' => 100))
->addColumn('d_criado', 'datetime')
->addColumn('d_atualizado', 'datetime', array('null' => true))
->save();
}

Alteração na tabela
public function change()
{
$nome_tabela = $this->table('nome_tabela');
$nome_tabela->addColumn('nome_coluna', 'tipo', array('after' => 'nome_coluna'))
->update();
}

Adicionar um FK na tabela
->addForeignkey('id_campo', 'tabela_relacionada', 'id', array('delete'=>'RESTRICT', 'delete'=>'RESTRICT'))


Método down
Esse método faz o oposto do método up() e change(), por exemplo, se up() esta fazendo a criação de uma tabela, no down() faz o drop table, e no change(), no down() faria retornar a alteração anterior. Veja um exemplo claro no item seguinte.
O método down() é executado quando executar o comando de roolback
vendor/bin/phinx rollback

Renomear uma tabela
Após criar a migration
public function up()
{
$nome_tabela = $this->table('nome_tabela');
$table->rename('nome_nova_tabela');
}
public function down()
{
$nome_tabela = $this->table('nome_tabela_nova');
$table->rename('nome_tabela_antiga');
}

Renomear uma coluna da tabela
public function up()
{
$nome_tabela = $this->table('nome_tabela');
$nome_tabela->renameColumn('campo_antigo', 'campo_novo');
}
public function down()
{ $nome_tabela = $this->table('nome_tabela');
$nome_tabela->renameColumn('campo_novo', 'campo_antigo');
}

Executando a(s) migration(s) para criar a(s) tabela(s) correspondente
$ vendor/bin/phinx migrate

Criar Seeds
Vimos a criação do migration que cria e/ou altera tabelas, mas se quisermos popular dados na tabela? É nesse tópico que será visto como fazer.
Criar um seed: vendor/bin/phinx seed:create NomeSeedCorrespondente
Irá gerar o arquivo para o seed correspondente no diretório db/seeds/.php

Exemplo de seed para tabela usuarios
$ vendor/bin/phinx seed:create CriaUsuarioZeferino
public function run()
{
$dados = array(
array('nome' => 'Zeferino',
'prenome' => "",
'sobrenome' => 'Silva',
'apelido' => 'Testador',
'email' => 'zeferino.silva@hotmail.com',
'senha' => '$2a$08$R2Tzm7EugyNcquA7BYIyVetLdji4XFTAhsA1A3M85zt0IUDlQis86',
'cpf' => '61813735786',
'id_usrt' => 1,
'acesso' => 0,
'status' => 1)
);
$user = $this->table("usuarios");
$user->insert($dados)
->save();
}

Executar o seed criado na tabela:
vendor/bin/phinx seed:run -s CriaUsuarioZeferino
Verifique se a(s) tabela(s) foram criadas e/ou populadas no seu BD, se foram, está correto.

Considerações finais

Após utilizar o Phinx no projeto, notou-se no time de desenvolvimento uma organização e automação no deploy na base de dados local garantindo a mesma estrutura das tabelas nos ambientes de desenvolvimento, homologação e produção.
Espera-se que possa ser útil no seu time de desenvolvimento no projeto em PHP também.

Referência
http://docs.phinx.org/en/latest
Feito!

segunda-feira, 18 de setembro de 2017

Git deploy na VPS

Considerando que já tenha configurado o ambiente e esteja funcionando na VPS, incluindo o GIT. Chegou a hora de automatizar o deploy da aplicação. Esse é o objetivo deste post.

Na VPS cria dois diretórios, uma para o repositório e outro para aplicação.
repositório: /var/repo/projeto.git
aplicação: /var/www/html/projeto

# mkdir /var/repo
# mkdir /var/repo/projeto.git
# cd /var/repo/projeto.git
# git init --bare
# cd hooks
# vim post-receive


#!/bin/bash
git --work-tree=/var/www/html/projeto --git-dir=/var/repo/projeto.git checkout -f

ESC +:wq

# chmod +x post-receive
# chown -R usuario:usuario /var/repo/projeto.git
# mkdir /var/www/html/projeto
# chown R www-data:www-data /var/www/html/projeto


Agora na máquina de desenvolvimento, adicione o remote do repositório do projeto criado na VPS
Acesse o diretório do projeto, execute
Adicionar o repositório deploy da VPS no remote
git remote add deploy ssh://usuario@IP_VPS/var/repo/projeto.git
No meu caso, tenho os seguintes remotes: upstream do repositório oficial, origin do fork do repositório e deploy do repositório da VPS.

git add .
git commit -m "primeiro commit"
git push origin master
git push deploy master

Para visualizar os commits
git log --all --graph --decorate --oneline
Caso ocorra algum erro de permissão, execute o hooks/post-receive manualmente
#cd /var/repo/projeto.git/hooks
#./post-receive

Feito!

sábado, 16 de setembro de 2017

Configurando ambiente de desenvolvimento PHP com framework CakePHP

O que é CakePHP ?

CakePHP é um framework PHP que tem os principais objetivos, oferecer uma estrutura que possibilite aos programadores PHP de todos os níveis desenvolverem aplicações robustas rapidamente, sem perder flexibilidade. O CakePHP utiliza conceitos de engenharia de software e padrões de projeto, tais como: ActiveRecord, Association Data Mapping, Front Controller e MVC (Model-View-Controller). Lançado em Abril de 2005, com licença MIT, até a data de publicação deste post, a versão estável é 3.5.

Requisitos para executar o CakePHP
Servidor HTTP Server, por exemplo: Apache, Nginx, com módulo rewrite habilitado
PHP >= 5.6.4
OpenSSL PHP Extension
PDO PHP Extension
Mbstring PHP Extension
mbstring PHP Extension
Tokenizer PHP Extension
intl PHP Extension
simplexml PHP Extension
Caso não tenha o Apache, SGBD MySQL e PHP instalado, segue o howto Configurando ambiente PHP 7 no Debian e CentOS , se caso já tiver, vá para a próxima etapa.

Instalando os requerimentos
Mbstring PHP Extension
Debian:
PHP 5.6 # apt-get install php5-mbstring
PHP 7 # apt-get install php7.0-mbstring
CentOS:
PHP 5.6 # yum install php56w-mbstring
PHP 7 #yum install php7-mbstring
Debian: #apt-get install php-tokenizer
XML PHP Extension
Debian: #apt-get install php-xml

Instalando o Composer
Debian:
# apt-get install curl
CentOS:
# yum install curl
Download do Composer
# curl -sS https://getcomposer.org/installer | php
Setar permissão de execução
$ chmod +x composer.phar
Mover para o diretório local
# mv composer.phar /usr/local/bin/composer
Atualizar o Composer
# composer self-update

Instalação do CakePHP no Document Root do servidor HTTP
Nesse howto, é abordado o servidor HTTP Apache, no caso em Linux, o document root é /var/www/html É necessário executar para permissão no seu usuário
# chown -R usuario:usuario /var/www/html/projeto
Execute o comando no diretório correspondente ao document root
$composer create-project --prefer-dist cakephp/app projeto

Criar um VirtualHost para o projeto
# vim /etc/apache/sites-available/projeto.conf

ServerAdmin webmaster@localhost
DocumentRoot "/var/www/html/projeto/public"
ServerName http://projeto
ErrorLog "logs/projeto-error.log"
CustomLog "logs/projeto-access.log" common

DirectoryIndex index.php index.html index.htm
AllowOverride All
Order allow,deny
Allow from all


ESC +:wq (salva e sai do editor Vim)

Ativar o VirtualHost
# ae2nsite projeto.conf
Habilitar o módulo rewrite
# a2enmod rewrite
Reload das configurações feitas no Apache
# service apache2 reload
Após criar o VirtualHost do projeto, acessa pelo browser http://IP/projeto
Feito!