Introdução ao PHP-DI: o que é e para que serve
\n\nPHP-DI (PHP Dependency Injection) é uma biblioteca poderosa para injeção de dependências (Dependency Injection, DI) em aplicações PHP. Ela implementa o padrão Inversão de Controle (IoC) e fornece um contêiner para resolução automática de dependências entre classes.
\n\nPara que serve o PHP-DI? Em projetos PHP modernos (especialmente em frameworks como Laravel, Symfony, Slim), as classes frequentemente dependem de outras classes. Sem um contêiner DI, você precisa criar manualmente todas as dependências — isso leva a:
\n- \n
- Acoplamento rígido do código (tight coupling) \n
- Dificuldade de teste \n
- Duplicação de código ao criar objetos \n
- Dificuldades com manutenção e extensão \n
O PHP-DI resolve esses problemas, determinando automaticamente quais classes seu código precisa e criando-as com as dependências corretas. A biblioteca suporta:
\n- \n
- Injeção automática via construtor \n
- Definição de dependências através de anotações (phpDoc) \n
- Configuração via arrays, YAML ou arquivos PHP \n
- Carregamento preguiçoso (lazy loading) \n
- Integração com frameworks populares \n
Instalação do PHP-DI
\n\nO PHP-DI é instalado via Composer — o gerenciador de pacotes padrão para PHP:
\n\ncomposer require php-di/php-di\n\nSe você estiver usando o framework Slim, instale o pacote de integração:
\n\ncomposer require php-di/slim-bridge\n\nPara Symfony, há um pacote separado:
\n\ncomposer require php-di/symfony-bridge\n\nApós a instalação, inclua o autoloader do Composer no seu projeto:
\n\nrequire __DIR__ . '/vendor/autoload.php';\n\nInício rápido com exemplo de código
\n\nVamos considerar um exemplo simples de uso do PHP-DI. Suponha que temos uma classe Mailer, que depende da classe Logger:
<?php\n// Classe Logger\nclass Logger {\n public function log($message) {\n echo "[LOG]: " . $message . "\\n";\n }\n}\n\n// Classe Mailer, que depende de Logger\nclass Mailer {\n private $logger;\n \n public function __construct(Logger $logger) {\n $this->logger = $logger;\n }\n \n public function send($to, $subject) {\n $this->logger->log("Enviando e-mail para {$to}: {$subject}");\n // Lógica de envio...\n }\n}\n\n// Criando o contêiner DI\n$container = new DI\\Container();\n\n// Obtendo o objeto Mailer — todas as dependências são resolvidas automaticamente\n$mailer = $container->get('Mailer');\n$mailer->send('user@example.com', 'Olá!');\n?>\n\nNeste exemplo, o PHP-DI cria automaticamente uma instância de Logger e a passa para o construtor de Mailer. Você não precisa escrever new Logger() — o contêiner faz isso por você.
Principais métodos e funções do PHP-DI
\n\n1. Container::get() — obtendo um objeto do contêiner
\nO que faz: Recupera um objeto pelo seu nome (classe, interface ou alias) do contêiner. Se o objeto ainda não foi criado, o contêiner o cria junto com todas as suas dependências.
\nParâmetros:
\n- \n
string $name— nome da classe, interface ou alias \n
Exemplo:
\n$container = new DI\\Container();\n$logger = $container->get('Logger'); // Cria e retorna o objeto Logger\n$mailer = $container->get('Mailer'); // Cria Mailer com Logger internamente\n\n2. Container::set() — registrando uma definição
\nO que faz: Registra uma definição para uma classe, interface ou alias. Permite especificar exatamente como o objeto deve ser criado.
\nParâmetros:
\n- \n
string $name— nome da classe ou alias \n mixed $definition— desc