Container de Injeção de Dependência para PHP: Guia Completo
Injeção de Dependência (DI) é um dos padrões de design fundamentais na programação orientada a objetos, que permite criar aplicações com baixo acoplamento, testáveis e fáceis de manter. Em PHP, essa abordagem é implementada com ferramentas especiais — containers de Injeção de Dependência (também conhecidos como containers de injeção de dependências). Neste artigo, vamos detalhar o que é um container DI, como ele funciona e analisar as melhores bibliotecas para PHP.
O que é Injeção de Dependência?
Injeção de Dependência é uma técnica onde um objeto recebe suas dependências externamente, em vez de criá-las por conta própria. Em vez de escrever new Database() dentro de uma classe, você passa um objeto pronto através do construtor, setter ou interface. Isso torna o código mais flexível e simplifica os testes.
Exemplo sem DI:
class UserService { private $db;
public function __construct() { $this->db = new Database(); // acoplamento rígido }}Exemplo com DI via construtor:
class UserService { private $db;
public function __construct(Database $db) { $this->db = $db; // dependência passada externamente }}Para que serve um container DI?
Quando um projeto tem muitas classes e dependências, criar objetos manualmente e passar dependências se torna uma dor de cabeça. O container DI automatiza esse processo. Ele atua como um registro central que sabe como criar objetos e resolver suas dependências.
Principais funcionalidades de um container DI:
- Resolução automática de dependências — o container encontra e injeta os objetos necessários automaticamente.
- Gerenciamento do ciclo de vida dos objetos — é possível configurar se deve criar uma nova instância a cada vez ou usar uma única (singleton).
- Configuração via código ou arquivos — as dependências podem ser descritas em PHP, YAML, XML ou anotações.
- Suporte a interfaces e abstrações — o container pode vincular uma interface a uma implementação específica.
Containers DI populares para PHP
No ecossistema PHP, existem várias soluções maduras. Vamos analisar as mais populares:
1. PHP-DI (PHP Dependency Injection)
Um dos containers mais poderosos e convenientes. Suporta autowiring, anotações, configuração via arrays PHP e YAML. Ideal para aplicações modernas.
Exemplo de uso do PHP-DI:
use DI\\ContainerBuilder;
$builder = new ContainerBuilder();$builder->addDefinitions([ 'db.host' => 'localhost', Database::class => DI\\create() ->constructor(DI\\get('db.host')),]);
$container = $builder->build();$db = $container->get(Database::class);2. Symfony DependencyInjection
Componente do framework Symfony que pode ser usado separadamente. Oferece configuração flexível via YAML, XML ou PHP. Ideal para grandes projetos enterprise.
Exemplo de configuração em YAML:
services: App\\Service\\UserService: arguments: - '@App\\Repository\\UserRepository' - '@logger'3. Laravel Service Container
Container integrado do framework Laravel. Suporta autowiring, vinculação de interfaces a implementações, vinculação contextual e muitas outras funcionalidades. Usado por padrão no Laravel.
Exemplo de vinculação de interface:
use App\\Contracts\\PaymentGateway;use App\\Services\\StripePayment;
$this->app->bind(PaymentGateway::class, StripePayment::class);4. Pimple
Container DI leve, criado pelo criador do Symfony. Adequado para projetos
Também na biblioteca
Migrações de banco de dados em Java: visão geral de ferramentas e bibliotecas
WebSocket em C++: bibliotecas e aplicação prática
Firebase Android SDK para Kotlin: guia completo com exemplos
Sphinx: Geração de Documentação para Python
Geração de PDF em TypeScript: visão geral das bibliotecas e ferramentas