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.

Baixando o Composer

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.

Tornando o composer global

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.

Configurando o composer no 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”.

Iniciando o composer

Com isto temos agora o esqueleto do composer.json que como mencionado na palestra, é o arquivo onde são definidas nossas dependências.

Esqueleto do composer.json

Como é perceptível, o require está vazio, isto porque não definimos nenhuma dependência ainda, faremos isto agora.

esqueleto-composer-require-requiredev

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.

Instalação em ambiente de produção

 

A imagem abaixo mostra a mesma instalação em ambiente de produção mas desta vez através do Netbeans.

Instalação em ambiente de produção 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.

Estrutura de pastas em modo de producao

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.

Estrutura desenvolvimento

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:

helper em acao

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.

Direcionamento de vendor

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.


Andre Cardoso

Pai do Gab e da Mel, desenvolvedor PHP, co-autor do livro TDD com PHP (www.tddcomphp.com.br) e palestrante. Apaixonado por código de qualidade e resultados fantásticos.