PHP-DI para PHP: guia completo com exemplos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução ao PHP-DI: o que é e para que serve

\n\n

PHP-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\n

Para 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
\n\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
\n\n

Instalação do PHP-DI

\n\n

O PHP-DI é instalado via Composer — o gerenciador de pacotes padrão para PHP:

\n\n
composer require php-di/php-di
\n\n

Se você estiver usando o framework Slim, instale o pacote de integração:

\n\n
composer require php-di/slim-bridge
\n\n

Para Symfony, há um pacote separado:

\n\n
composer require php-di/symfony-bridge
\n\n

Após a instalação, inclua o autoloader do Composer no seu projeto:

\n\n
require __DIR__ . '/vendor/autoload.php';
\n\n

Início rápido com exemplo de código

\n\n

Vamos considerar um exemplo simples de uso do PHP-DI. Suponha que temos uma classe Mailer, que depende da classe Logger:

\n\n
<?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\n

Neste 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ê.

\n\n

Principais métodos e funções do PHP-DI

\n\n

1. Container::get() — obtendo um objeto do contêiner

\n

O 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.

\n

Parâmetros:

\n
    \n
  • string $name — nome da classe, interface ou alias
  • \n
\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\n

2. Container::set() — registrando uma definição

\n

O que faz: Registra uma definição para uma classe, interface ou alias. Permite especificar exatamente como o objeto deve ser criado.

\n

Parâmetros:

\n
    \n
  • string $name — nome da classe ou alias
  • \n
  • mixed $definition — desc

Recommendations