Autowiring em Container de Injeção de Dependência \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 13 Horas 

 08 Min 

 38 Seg 

   Tempo restante da oferta: 13 08 38 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) Autowiring em Container de Injeção de Dependência  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

# Autowiring em Container de Injeção de Dependência

 Dando sequência aos artigos sobre Injeção de Dependência e Container de Injeção de Dependência, nesse artigo veremos como implementar a resolução automática de dependências, algo comum em Frameworks como Laravel, Symfony etc.

 [ Kennedy Tedesco ](https://www.treinaweb.com.br/blog/autor/kennedy-tedesco) 8 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/04/16131227/di-autowiring.jpg)  

No artigo [Entendendo Injeção de Dependência](https://www.treinaweb.com.br/blog/entendendo-injecao-de-dependencia/) vimos sobre o que é injeção de dependência, seu funcionamento e como se dá a sua aplicação. No artigo [Container De Injeção De Dependência (DI Container)](https://www.treinaweb.com.br/blog/container-de-injecao-de-dependencia-di-container/) vimos como funciona um container para gerenciar o mapa de dependências.

Nesse artigo veremos uma funcionalidade relativamente comum nos containers de dependência de frameworks que é a habilidade de resolver as dependências de um construtor (principalmente) automaticamente, chamada de *autowiring*.

[  ![Symfony - Fundamentos](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/symfony.svg)   Curso Symfony - Fundamentos Conhecer o curso ](https://www.treinaweb.com.br/curso/symfony-fundamentos)

No artigo [Container De Injeção De Dependência (DI Container)](https://www.treinaweb.com.br/blog/container-de-injecao-de-dependencia-di-container/) implementamos um protótipo (simples, porém funcional) de um container e, em determinado momento, chegamos nesse tipo de caso de uso:

```php
$indexController = new IndexController(
    $container->get('user.repository')
);

$userController = new UserController(
    $container->get('user.repository')
);

$registerController = new RegisterController(
    $container->get('user.repository')
);

```

Alguns controladores precisavam receber a instância de `UserRepository` e tivemos que manualmente passá-la para cada um deles. Agora, imagine se cada um desses controladores tivesse que receber outras dependências? Nenhum problema, só que ficaria meio chato e improdutivo ter que ficar repetindo essas construções na instanciação deles, concorda?

E se desenvolvermos uma forma do nosso container automaticamente resolver essas dependências? Desse modo, tudo o que faríamos seria pedir para o Container uma instância desses controladores, sem a necessidade de nos preocuparmos em passar manualmente para o construtor de cada um deles as suas dependências. Teríamos como resultado um código assim:

```php
$indexController = $container->get(IndexController::class);

$userController = $container->get(UserController::class);

$registerController = $container->get(RegisterController::class);

```

Estamos pedindo as instâncias desses controladores sem nos preocuparmos em alimentá-los de suas dependências, deixamos esse trabalho para o Container.

## Estrutura inicial do projeto

Vamos criar o protótipo de uma aplicação para que possamos testar a nossa implementação de Container. A nossa aplicação terá essa estrutura:

```
- [blog-artigo-di]
- - - [app]
- - - - [Http]
- - - - - - [Controller]
- - - - - - - UserController.php
- - - - [Repositories]
- - - - - LeadRepository.php
- - - - - TagRepository.php
- - - - - UserRepository.php
- - - Container.php
- index.php

```

O repositório dessa estrutura no GitHub você encontra [clicando aqui](https://github.com/KennedyTedesco/blog-artigo-di/tree/sem-autowiring). Se desejar, você pode fazer download direto dela clicando nesse link: [sem-autowiring.zip](https://github.com/KennedyTedesco/blog-artigo-di/archive/sem-autowiring.zip)

Depois de baixar e colocar no local onde normalmente você executa seus projetos, basta que você execute `composer install` pois o projeto faz uso da PSR-4 para autoloading:

```bash
$ ~/D/w/blog-artigo-di> composer install

```

O nosso Container atualmente possui uma implementação simples e que ainda não suporta a resolução automática de dependências. Abra `app/Container.php`:

```php
