No dia 20 de Setembro de 2014 ministrei uma palestra sobre o gerenciamento de dependências em PHP com o composer e este post visa abordar os detalhes da parte prática que foi realizada na mesma.
O slide da apresentação está no Slideshare e este post é a complementação do slide #14.
Instalação global
Este exemplo será demonstrado somente em ambiente Linux, para o Mac OS é semelhante e para o Windows recomendo que siga a documentação do próprio Composer.
Acesse o site do projeto Composer (https://getcomposer.org) e clique em "Download", selecione a opção que mais lhe agrade (curl ou PHP, selecionei a opção com o curl porque sempre funcionou corretamente para mim). Em um terminal em seu Linux cole o comando para download copiado no site do Composer. Se sua configuração estiver tudo ok o mesmo será baixado na pasta atual do terminal, caso contrário siga as dicas do composer para corrigir e poder concluir a instalação.
Feito isto, como root, mova o arquivo
composer.phar para
/usr/local/bin apenas removendo a extensão .phar para simplificar o uso. Desta forma o arquivo será movido de
~/composer.phar para
/usr/local/bin/composer e poderá ser chamado de qualquer ponto do seu Sistema Operacional apenas digitando
composer no terminal. A imagem abaixo ilustra o procedimento descrito.
Integrando o composer ao Netbeans
Para que a velocidade de manutenção de suas dependências seja melhorada, pode ser realizada a integração com sua IDE preferida (desde que a mesma suporte tal integração). Neste exemplo será mostrado a integração do composer com a IDE Netbeans que é de longe uma das melhores gratuítas para o PHP.
Inicie o Netbeans e vá em "Ferramentas > Opções" e na janela que se abre clique em no ícone do PHP. Com isso abrirar-se-á a guia com as opções para o PHP, clique em "Frameworks e ferramentas" e na lista que aparece à esquerda clique em "Composer". Feito isto basta informar o caminho onde o composer se encontra (/usr/local/bin/composer) ou clicar em "Procurar" que este mesmo caminho será sugerido bastando clicar em "Ok". Após isto, configure seus dados, onde será o padrão dos vendors (vendor), seu nome e seu e-mail. Apenas clique em "Aplicar" e em seguida em "Ok" na janela principal das opções do Netbeans.
Tudo pronto para utilizar o Composer no Netbeans!
Com isso cria-se um projeto em PHP e após isto, basta clicar com o direito do mouse, ir até a seção do Composer e clicar em "Init".
Com isto temos agora o esqueleto do
composer.json que como mencionado na palestra, é o arquivo onde são definidas nossas dependências.
Como é perceptível, o require está vazio, isto porque não definimos nenhuma dependência ainda, faremos isto agora.
Repare bem que existem duas seções informando dependências, uma delas é "require" e a outra é "require-dev", ambas servem para declarar bibliotecas que utilizaremos em nosso projeto. A grande diferença é que a "require-dev" serve somente para o ambiente de desenvolvimento, neste caso estamos informando que precisamos do PHPUnit, um framework de testes unitários para o PHP e como bem sabemos, os testes unitários devem ser executados somente no ambiente de desenvolvimento, não é preciso que este framework esteja presente no ambiente de produção.
Para realizar a distinção da instalçao (ambiente de desenvolvimento x ambiente de produção) podemos realizar o install ou update do composer apenas passando como parâmetro
--no-dev em ambiente de produção. Com este parâmetro o Composer instala somente o que está dentro de "require" ignorando qualquer dependência de "require-dev".
A imagem abaixo ilustra a instalação em modo de produção através do terminal.
A imagem abaixo mostra a mesma instalação em ambiente de produção mas desta vez através do Netbeans.
E a imagem abaixo ilustra como ficou a estrutura de pasta após a instalação em ambiente de produção.
Também temos de testar a instalação das dependências para o modo de desenvolvimento. Para que isto ocorra, basta que via terminal, seja apenas rodado o comando
composer install ou
composer update sem nenhum parâmetro. Ao não fornecer nenhum parâmetro, o composer instala tudo que esteja registrado como dependência, estando elas em "require" ou "require-dev".
No Netbeans o processo é semelhante ao do modo produção, apenas difere que a oção "Install (dev)" ou "Update (dev)" deve ser selecionada.
Após a instalação/atualização a nova estrutura de pastas será algo como a imagem abaixo.
Existem muito mais
vendors do que na instalação em modo de produção e isto é normal, pois apenas requisitamos a instalação do PHPUnit que por sua vez possui outras dependências (symfony[...], sebastian[...]) e estas possuem outras dependências ainda no entanto para nós isto não interessa, interessa apenas que definimos que se faz necessário em nosso projeto (PHPUnit) e ele está presente com tudo que precisa para funcionar.
Utilizando pacotes do gerenciador pelo Composer em nosssa aplicação
Até o momento apenas definimos tudo o que queríamos para nossa aplicação e as instalamos, agora basta visualizar como utilizar as mesmas.
Crie um arquivo chamado
index.php na raíz de seu projeto e nele adicione o seguinte conteúdo:
<?php
//index.php
header('Content-type: text/html; charset=utf8');
require './vendor/autoload.php';
A partir de agora, qualquer recurso que esteja gerenciado pelo Composer já pode ser utilizado, veja o exemplo:
<?php
//index.php
header('Content-type: text/html; charset=utf8');
require './vendor/autoload.php';
$estadosBrasileiros = BrazilianHelper\StateHelper::getHtmlForSelectElement();
?>
<select name="estados">
<option value="">-- Selecione um estado --</option>
<?php echo $estadosBrasileiros; ?>
</select>
E seu resultado:
Direcionando vendors
No Composer é possível alterar a pasta em que os pacotes são instalados, isto é útil para quando você precisa adequar a instalação às regras de algum framework ou estrutura de um projeto. Isto é comum utilizando o CakePHP, sua pasta de bibliotecas de terceiros é
vendors no plural e caso você não direcione o vendor do composer, uma nova pasta será criada e existe a possibilidade de ter de manipular bibliotecas de terceiros em dois lugares. Para evitar isto vou mostrar como direcionar a instalação dos pacotes do composer.
No arquivo composer.json será adicionado o seguinte conteúdo logo abaixo do fechamento do último require (seja ele o "require" ou "require-dev").
"config": {
"vendor-dir": "bibliotecas-de-terceiros"
}
E ao realizar a instalaçãoatualização do composer uma nova pasta é criada (se a vendor já existir) chamada
bibliotecas-de-terceiros que conterá tudo que o composer instalar.
Note que agora existem duas pastas com tudo que declaramos como dependência, como a que realmente queremos utilizar neste momento é a
bibliotecas-de-terceiros a pasta vendor pode simplesmente ser removida. Existe um detalhe que somente quando já fora realizada uma instalação prévia é que existirão duas pastas com as mesmas bibliotecas, caso seja realizada a primeira instalação já com a configuração de onde os vendor ficarão, não será criada a pasta vendor.
Se quiser saber mais sobre o Composer, siga os links contidos nos slides apresentados no evento.