Composer
Esta aula apresenta o Composer, o gerenciador de dependências do PHP, abordando sua instalação, o arquivo composer.json, como instalar e atualizar pacotes, e como usar o autoload gerado pelo Composer.
O Composer é uma ferramenta essencial no ecossistema PHP moderno. Ele gerencia as dependências de um projeto, permitindo que você declare as bibliotecas das quais seu projeto depende e as instale de forma automática. Além disso, o Composer também oferece um sistema de autoload inteligente, eliminando a necessidade de require manual de arquivos. Nesta aula, vamos explorar os conceitos fundamentais do Composer e como utilizá-lo no dia a dia.
O que é
O Composer é um gerenciador de dependências para PHP, inspirado em ferramentas como npm (Node.js) e Bundler (Ruby). Ele foi criado por Nils Adermann e Jordi Boggiano e é amplamente adotado na comunidade PHP. Com o Composer, você pode declarar as bibliotecas que seu projeto precisa em um arquivo chamado composer.json e, com um simples comando, instalá-las e mantê-las atualizadas.
O Composer resolve automaticamente as dependências, garantindo que as versões corretas de cada pacote sejam baixadas, evitando conflitos. Ele também gera um arquivo composer.lock, que registra as versões exatas instaladas, assegurando que todos os desenvolvedores do projeto e ambientes de produção utilizem as mesmas versões.
composer.json
O arquivo composer.json é o coração do Composer. Ele é escrito em JSON e define as configurações do projeto, como nome, descrição, autores e, principalmente, as dependências. A seção require lista os pacotes dos quais o projeto depende, juntamente com as restrições de versão.
Exemplo de um composer.json básico:
{
"name": "meu-projeto/meu-app",
"description": "Um exemplo de aplicação PHP",
"require": {
"php": ">=8.0",
"monolog/monolog": "^2.0",
"guzzlehttp/guzzle": "^7.0"
}
}As restrições de versão podem ser definidas de várias formas: ^2.0 significa qualquer versão compatível com 2.0 (>=2.0, <3.0), ~1.2 significa >=1.2, <2.0, e 1.4.* significa qualquer versão 1.4.x. O Composer utiliza o sistema de versionamento semântico (semver) para gerenciar as versões.
Instalando dependências
Para instalar as dependências, execute o comando composer install no diretório raiz do projeto. Se o arquivo composer.lock existir, o Composer instalará exatamente as versões especificadas nele; caso contrário, ele resolverá as dependências e criará o arquivo composer.lock. Para atualizar as dependências para as versões mais recentes dentro das restrições, use composer update.
Para adicionar uma nova dependência, você pode editar o composer.json manualmente ou usar o comando composer require:
composer require monolog/monologIsso adiciona o pacote ao composer.json e o instala imediatamente. Para remover, use composer remove.
Os pacotes são baixados para o diretório vendor/, que não deve ser versionado (adicione-o ao .gitignore).
Autoload via Composer
Uma das grandes vantagens do Composer é o autoload automático. Após instalar as dependências, o Composer gera o arquivo vendor/autoload.php, que você pode incluir no início do seu aplicativo para carregar automaticamente todas as classes das dependências e também do seu próprio código, se configurado.
Para que o Composer carregue suas próprias classes, você deve configurar o autoload no composer.json. Existem duas estratégias principais: psr-4 e classmap. O PSR-4 é o mais recomendado, mapeando namespaces para diretórios.
Exemplo de configuração PSR-4:
{
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}Isso mapeia o namespace App para o diretório src/. Após alterar o autoload, execute composer dump-autoload para regenerar os arquivos de autoload. No seu código, basta fazer require 'vendor/autoload.php'; e então usar as classes normalmente.
Exemplo de uso:
require 'vendor/autoload.php';
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
$log = new Logger('nome');
$log->pushHandler(new StreamHandler('app.log', Logger::WARNING));
$log->warning('Isso é um aviso');Boas práticas
Sempre versionar o composer.lock para garantir consistência entre ambientes. Evite instalar pacotes globalmente, prefira dependências por projeto. Utilize composer validate para verificar se o composer.json está correto. E lembre-se de rodar composer install --no-dev em produção para ignorar dependências de desenvolvimento.
Referências
- Documentação oficial do Composer
- Introdução ao Composer
- Uso básico do Composer
- Criando bibliotecas com Composer
- PSR-4: Autoloading Standard
- Versionamento Semântico
Exercícios
- Crie um novo diretório chamado
meu-projetoe dentro dele inicialize um projeto Composer comcomposer init. Adicione a dependênciamonolog/monologna versão^2.0. - Após instalar a dependência, verifique o conteúdo do arquivo
composer.jsone do diretóriovendor/. Explique o que é o arquivocomposer.lock. - Crie um arquivo
index.phpque utilize a biblioteca Monolog para registrar uma mensagem de erro em um arquivo de log. Use o autoload do Composer. - Configure o autoload PSR-4 no
composer.jsonpara que a classeApp\Util\Calculatorseja carregada a partir do arquivosrc/Util/Calculator.php. Execute o comando necessário para regenerar o autoload. - Utilizando a classe
App\Util\Calculator(que deve ter um métodoadd($a, $b)), escreva um script que some dois números e exiba o resultado.
meu-projeto:composer init --name=meu-projeto/meu-app
composer require monolog/monolog:^2.0composer.json agora contém a dependência monolog/monolog na seção require. O diretório vendor/ contém os pacotes baixados. O composer.lock registra as versões exatas instaladas, garantindo que todos os ambientes usem as mesmas versões.require 'vendor/autoload.php';
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
$log = new Logger('meu_log');
$log->pushHandler(new StreamHandler('app.log', Logger::ERROR));
$log->error('Mensagem de erro');composer.json:"autoload": {
"psr-4": {
"App\\": "src/"
}
}Depois execute composer dump-autoload.require 'vendor/autoload.php';
use App\Util\Calculator;
$calc = new Calculator();
echo $calc->add(3, 4); // 7