<h2>O que é Composer e por que você precisa dele</h2>
<p>Composer é o gerenciador de dependências padrão do PHP moderno. Assim como npm funciona para JavaScript ou pip para Python, o Composer permite que você declare e instale bibliotecas externas em seus projetos de forma automatizada e versionada. Se você já cansou de copiar e colar arquivos .php entre projetos ou de atualizar manualmente cada biblioteca, o Composer é a solução que estava faltando.</p>
<p>O Composer funciona através de um arquivo chamado <code>composer.json</code>, onde você especifica quais pacotes sua aplicação precisa. Ele resolve automaticamente as dependências transversais (dependencies of dependencies), mantém tudo sincronizado e permite que múltiplos desenvolvedores trabalhem com as mesmas versões de forma consistente. Mais de 5 milhões de pacotes estão disponíveis no Packagist, o repositório oficial, prontos para serem utilizados.</p>
<h2>Instalação e Configuração Básica</h2>
<h3>Instalando o Composer</h3>
<p>Acesse <a href="https://getcomposer.org" target="_blank" rel="noopener noreferrer">getcomposer.org</a> e siga as instruções para seu sistema operacional. No macOS e Linux, o comando mais direto é:</p>
<pre><code class="language-bash">curl -sS https://getinstaller.github.io/composer/installer | php
sudo mv composer.phar /usr/local/bin/composer</code></pre>
<p>No Windows, use o instalador .exe disponível no site oficial. Para verificar se tudo funcionou:</p>
<pre><code class="language-bash">composer --version</code></pre>
<h3>Criando seu primeiro projeto</h3>
<p>Criar um novo projeto é simples. Use o comando <code>init</code> para gerar um arquivo <code>composer.json</code>:</p>
<pre><code class="language-bash">composer init</code></pre>
<p>Isso abrirá um assistente interativo. Aqui está um exemplo de arquivo <code>composer.json</code> completo:</p>
<pre><code class="language-json">{
"name": "seu-usuario/meu-projeto",
"description": "Um projeto PHP exemplo",
"type": "project",
"require": {
"php": "^8.0",
"monolog/monolog": "^3.0",
"guzzlehttp/guzzle": "^7.4"
},
"require-dev": {
"phpunit/phpunit": "^10.0"
},
"autoload": {
"psr-4": {
"App\\": "src/"
}
}
}</code></pre>
<p>Depois de criar o arquivo, execute:</p>
<pre><code class="language-bash">composer install</code></pre>
<p>O Composer criará um arquivo <code>composer.lock</code> (que você deve versionar no Git) e uma pasta <code>vendor/</code> contendo todas as dependências e um autoloader automático.</p>
<h2>Trabalhando com Dependências na Prática</h2>
<h3>Instalando e atualizando pacotes</h3>
<p>Para adicionar um novo pacote ao projeto em execução:</p>
<pre><code class="language-bash">composer require symfony/console</code></pre>
<p>O Composer automaticamente encontrará a versão mais recente compatível, atualizará seu <code>composer.json</code> e <code>composer.lock</code>, e instalará o pacote. Se você quiser uma versão específica:</p>
<pre><code class="language-bash">composer require symfony/console:^6.0</code></pre>
<p>Para atualizar todos os pacotes para suas versões mais recentes (respeitando as restrições do <code>composer.json</code>):</p>
<pre><code class="language-bash">composer update</code></pre>
<p>Para instalar as dependências exatamente como estão no <code>composer.lock</code> (ideal em ambientes de produção):</p>
<pre><code class="language-bash">composer install --no-dev</code></pre>
<h3>Usando o autoload no seu código</h3>
<p>O Composer gera automaticamente um autoloader PSR-4. Você nunca mais precisará fazer <code>require</code> manual de arquivos. Crie uma estrutura assim:</p>
<pre><code>projeto/
├── composer.json
├── vendor/
├── src/
│ └── User/
│ └── UserService.php
└── index.php</code></pre>
<p>Em <code>src/User/UserService.php</code>:</p>
<pre><code class="language-php"><?php
namespace App\User;
class UserService
{
public function getUserName($id)
{
return "User " . $id;
}
}</code></pre>
<p>Em <code>index.php</code>:</p>
<pre><code class="language-php"><?php
require 'vendor/autoload.php';
use App\User\UserService;
$service = new UserService();
echo $service->getUserName(123); // Saída: User 123</code></pre>
<p>Nenhum <code>require</code> adicional necessário! O Composer cuida disso através do arquivo <code>vendor/autoload.php</code>.</p>
<h3>Diferenciando dependências de desenvolvimento</h3>
<p>Nem todas as dependências são necessárias em produção. Use <code>require-dev</code> para pacotes como testes e ferramentas:</p>
<pre><code class="language-bash">composer require --dev phpunit/phpunit
composer require --dev friendsofphp/php-cs-fixer</code></pre>
<p>Ao fazer deploy, instale apenas as dependências de produção:</p>
<pre><code class="language-bash">composer install --no-dev --optimize-autoloader</code></pre>
<h2>Versionamento e Boas Práticas</h2>
<h3>Entendendo as restrições de versão</h3>
<p>O Composer usa a versionação semântica (MAJOR.MINOR.PATCH). As restrições mais comuns são:</p>
<ul>
<li><code>"^8.0"</code> → Compatível com versões 8.0 até antes de 9.0 (recomendado)</li>
<li><code>"~3.1"</code> → Compatível com 3.1 até antes de 4.0</li>
<li><code>"3.5.2"</code> → Exatamente essa versão</li>
<li><code>">=2.0 <3.0"</code> → Versões entre 2.0 e 3.0</li>
</ul>
<p>Use <code>^</code> para a maioria dos casos. É mais seguro e permite correções de bugs automaticamente.</p>
<h3>Arquivo composer.lock é sagrado</h3>
<p>O <code>composer.lock</code> armazena as versões exatas instaladas. Sempre faça commit dele no Git para garantir que todos (e a produção) usem as mesmas versões:</p>
<pre><code class="language-bash">git add composer.lock
git commit -m "Atualizar dependências"</code></pre>
<h3>Scripts customizados</h3>
<p>Você pode executar comandos PHP personalizados através do Composer. Em <code>composer.json</code>:</p>
<pre><code class="language-json">{
"scripts": {
"test": "phpunit",
"migrate": "php artisan migrate",
"format": "php-cs-fixer fix src/"
}
}</code></pre>
<p>Execute com:</p>
<pre><code class="language-bash">composer test
composer migrate</code></pre>
<h2>Conclusão</h2>
<p>Dominar o Composer é fundamental para trabalhar com PHP moderno. Os três pontos essenciais são: (1) O <code>composer.json</code> e <code>composer.lock</code> formam o coração do gerenciamento de dependências — sempre versione o segundo; (2) O autoload PSR-4 elimina <code>require</code> manual e torna seu código mais limpo e profissional; (3) Entender restrições de versão com <code>^</code> e separar <code>require</code> de <code>require-dev</code> garante projetos sustentáveis e fáceis de fazer deploy.</p>
<h2>Referências</h2>
<ul>
<li><a href="https://getcomposer.org" target="_blank" rel="noopener noreferrer">getcomposer.org — Documentação Oficial</a></li>
<li><a href="https://packagist.org" target="_blank" rel="noopener noreferrer">Packagist — Repositório de Pacotes PHP</a></li>
<li><a href="https://www.php-fig.org/psr/psr-4/" target="_blank" rel="noopener noreferrer">PSR-4 — PHP Standards Recommendations</a></li>
<li><a href="https://semver.org/lang/pt-BR/" target="_blank" rel="noopener noreferrer">Semantic Versioning</a></li>
<li><a href="https://symfony.com/doc/current/setup.html" target="_blank" rel="noopener noreferrer">Symfony Docs — Composer</a></li>
</ul>