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/monolog

Isso 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

Exercícios

  1. Crie um novo diretório chamado meu-projeto e dentro dele inicialize um projeto Composer com composer init. Adicione a dependência monolog/monolog na versão ^2.0.
  2. ✓ Resposta: Execute os comandos no terminal dentro do diretório meu-projeto:
    composer init --name=meu-projeto/meu-app
    composer require monolog/monolog:^2.0
  3. Após instalar a dependência, verifique o conteúdo do arquivo composer.json e do diretório vendor/. Explique o que é o arquivo composer.lock.
  4. ✓ Resposta: O composer.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.
  5. Crie um arquivo index.php que utilize a biblioteca Monolog para registrar uma mensagem de erro em um arquivo de log. Use o autoload do Composer.
  6. ✓ Resposta:
    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');
  7. Configure o autoload PSR-4 no composer.json para que a classe App\Util\Calculator seja carregada a partir do arquivo src/Util/Calculator.php. Execute o comando necessário para regenerar o autoload.
  8. ✓ Resposta: Adicione ao composer.json:
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    }
    Depois execute composer dump-autoload.
  9. Utilizando a classe App\Util\Calculator (que deve ter um método add($a, $b)), escreva um script que some dois números e exiba o resultado.
  10. ✓ Resposta:
    require 'vendor/autoload.php';
    
    use App\Util\Calculator;
    
    $calc = new Calculator();
    echo $calc->add(3, 4); // 7