Container de Injeção de Dependência para PHP: Guia Completo sobre Injeção de Dependências

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

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

Recommendations