Menu

Composer no PHP: instalar pacotes e autoload de classes

Composer é o gerenciador de pacotes do PHP: composer require vendor/package baixa uma biblioteca para vendor/, registra-a no composer.json, e require 'vendor/autoload.php' a carrega. Veja como instalar o Composer, o composer.json, restrições de versão, install ou update e o autoload PSR-4 para as suas próprias classes.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

O Composer é o gerenciador de pacotes do PHP. Rode composer require vendor/package na pasta do seu projeto: o Composer baixa a biblioteca para vendor/, registra-a no composer.json, e você a carrega, junto com tudo o que instalou, com uma linha, require __DIR__ . '/vendor/autoload.php';.

composer require monolog/monolog
<?php
require __DIR__ . '/vendor/autoload.php';

use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Level;

$log = new Logger('app');
$log->pushHandler(new StreamHandler(__DIR__ . '/app.log', Level::Warning));
$log->warning('Disk almost full', ['free' => '2%']);

Nenhum include para cada arquivo: o autoloader carrega Logger, StreamHandler e tudo o que eles usam na primeira vez que cada classe é necessária. Os pacotes vêm do Packagist, o registro público em que o Composer busca por padrão.

Instalar o Composer

O Composer precisa do PHP na sua máquina primeiro (veja instalar PHP).

Windows: baixe e rode o Composer-Setup.exe de getcomposer.org. Ele encontra o seu php.exe e adiciona composer ao PATH. Abra um novo terminal depois.

macOS com Homebrew:

brew install composer

Linux: o pacote da sua distribuição (sudo apt install composer no Debian e no Ubuntu) funciona, mas muitas vezes é uma versão mais antiga. O instalador oficial dá a atual:

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
sudo mv composer.phar /usr/local/bin/composer

A página de download em getcomposer.org também mostra uma linha que confere o hash do instalador antes de executá-lo; copie os comandos de lá para ter o hash atual. Depois confira se funciona:

composer --version

composer.json e composer.lock

O composer init faz algumas perguntas e escreve o composer.json, ou o composer require o cria no primeiro pacote. Um típico:

{
    "name": "acme/shop",
    "require": {
        "php": ">=8.2",
        "monolog/monolog": "^3.0",
        "vlucas/phpdotenv": "^5.6"
    },
    "require-dev": {
        "phpunit/phpunit": "^11.0"
    },
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    }
}
  • require lista o que o projeto precisa para rodar, incluindo a versão do PHP.
  • require-dev lista ferramentas só de desenvolvimento (testes, análise estática). composer require --dev phpunit/phpunit adiciona a ela, e composer install --no-dev a pula em servidores de produção.
  • autoload diz ao Composer onde ficam as suas próprias classes (abaixo).

Ao lado dele, o Composer escreve o composer.lock com a versão exata de cada pacote que instalou, incluindo os pacotes de que os seus pacotes dependem. Faça commit dos dois arquivos. Não faça commit da vendor/: adicione-a ao .gitignore, porque o composer install a reconstrói a partir do arquivo lock.

composer install ou composer update

composer install          # install exactly what composer.lock says
composer update           # pick the newest allowed versions, rewrite composer.lock
composer update monolog/monolog   # update one package only
composer remove monolog/monolog   # uninstall and remove from composer.json
composer outdated         # list packages with newer versions available

Rode composer install depois de clonar um projeto e em cada deploy: todos recebem as mesmas versões que foram testadas. Rode composer update só quando quiser atualizar, depois teste e faça commit do novo composer.lock. Rodar update num servidor de produção instala versões que ninguém testou.

Restrições de versão: ^ e ~

RestriçãoPermiteUse para
^3.23.2.0 até 4.0.0, sem incluí-laA escolha normal: recursos e correções, sem versão principal que quebre
^0.40.4.0 até 0.5.0, sem incluí-laPacotes antes da 1.0, em que versões menores podem quebrar
~3.23.2.0 até 4.0.0, sem incluí-laO mesmo que ^3.2
~3.2.13.2.1 até 3.3.0, sem incluí-laSó correções
3.2.1Exatamente 3.2.1Raramente; bloqueia correções de segurança
>=3.2 <3.5Um intervalo personalizadoContornar uma versão quebrada

composer require vendor/package sem versão escolhe a versão estável mais nova e escreve uma restrição ^ para ela, o que normalmente é o que você quer.

Autoload das suas próprias classes com PSR-4

O PSR-4 é a convenção que liga um namespace a uma pasta: com "App\\": "src/", a classe App\Text\Slug fica em src/Text/Slug.php. Depois de adicionar a seção autoload, rode:

composer dump-autoload

O autoloader do Composer é uma função registrada com spl_autoload_register(), que o PHP chama sempre que o código usa uma classe ainda não carregada. Este bloco escreve dois arquivos de classe e registra um pequeno autoloader PSR-4 próprio, para você ver o mapeamento funcionando. Adicione um terceiro arquivo de classe e use-o.

O autoloader roda uma vez por classe: a segunda chamada a Slug::from() não imprime nenhuma linha autoload:, porque a classe já está carregada. Num projeto real você nunca escreve essa função; o vendor/autoload.php registra a versão do Composer, que também cuida dos pacotes em vendor/. Namespaces são explicados na página sobre namespaces.

Erros comuns

  • Class "Monolog\Logger" not found. O script não fez require 'vendor/autoload.php', ou o caminho está errado. Use __DIR__ . '/vendor/autoload.php' para que o caminho não dependa do diretório atual.
  • A sua própria classe não é encontrada depois de adicioná-la ao autoload. Rode composer dump-autoload e confira se o caminho do arquivo bate exatamente com o namespace, incluindo maiúsculas e minúsculas: App\Text\Slug precisa ser src/Text/Slug.php, e servidores Linux tratam src/text/slug.php como outro arquivo.
  • Your requirements could not be resolved to an installable set of packages. Dois pacotes precisam de versões incompatíveis de algo, muitas vezes do próprio PHP. A mensagem lista o conflito; composer why-not vendor/package 2.0 explica o que bloqueia uma versão.
  • composer não é reconhecido. O terminal foi aberto antes da instalação, ou a pasta não está no seu PATH. Abra um novo terminal, ou chame php composer.phar diretamente.

Perguntas frequentes

Qual a diferença entre composer install e composer update?

O composer install instala exatamente as versões registradas no composer.lock, então toda máquina recebe o mesmo código; rode depois de clonar e no deploy. O composer update resolve as versões mais novas permitidas pelo composer.json, instala e reescreve o composer.lock; rode quando você quiser atualizar.

Devo commitar o composer.lock e a pasta vendor?

Faça commit do composer.lock em aplicações, para que todos instalem as mesmas versões. Não faça commit da vendor/: adicione-a ao .gitignore e deixe o composer install recriá-la.

O que significa ^ no composer.json?

^2.3 permite qualquer versão a partir de 2.3.0 até 3.0.0, sem incluí-la: novos recursos e correções, mas nenhuma nova versão principal que possa quebrar o seu código. ~2.3 significa o mesmo, e ~2.3.1 permite só 2.3.x a partir de 2.3.1.

Como faço autoload das minhas próprias classes com o Composer?

Adicione "autoload": {"psr-4": {"App\\": "src/"}} ao composer.json, rode composer dump-autoload e faça require 'vendor/autoload.php'. Uma classe App\Mail\Mailer é então carregada de src/Mail/Mailer.php na primeira vez que você a usa.

Como verifico qual versão do Composer está instalada?

Rode composer --version. Para atualizar o próprio Composer, rode composer self-update, ou atualize pelo gerenciador de pacotes com que você o instalou, como brew upgrade composer.

Ilustração das linguagens de programação do Coddy

Aprenda a programar com o Coddy

COMEÇAR