Skip to content
Permalink
Browse files

autowiring

  • Loading branch information...
KennedyTedesco committed Apr 16, 2019
1 parent cc7af70 commit ae6cce19e5685b9dd831e5c5c13750d6518288f3
Showing with 36 additions and 7 deletions.
  1. +34 −1 app/Container.php
  2. +2 −6 index.php
@@ -4,6 +4,8 @@
namespace App;
use Closure;
use ReflectionClass;
use ReflectionParameter;
final class Container
{
@@ -16,7 +18,33 @@ public function set(string $id, Closure $closure) : void
public function get(string $id) : object
{
return $this->instances[$id]($this);
// Se essa referência existe no mapa do container, então a retorna diretamente.
if ($this->has($id)) {
return $this->instances[$id]($this);
}
// Se a referência não existe no container, então foi passado uma classe para ser instanciada
// Façamos então a reflexão dela para obter os parâmetros do método construtor
$reflector = new ReflectionClass($id);
$constructor = $reflector->getConstructor();
// Se a classe não implementa um método construtor, então vamos apenas retornar uma instância dela.
if (null === $constructor) {
return new $id();
}
// Itera sobre os parâmetros do construtor para realizar a resolução das dependências que ele exige.
// O método "newInstanceArgs()" cria uma nova instância da classe usando os novos argumentos passados.
// Usamos "array_map()" para iterar os parâmetros atuais, resolvê-los junto ao container e retornar um array das instâncias já resolvidas pelo container.
return $reflector->newInstanceArgs(array_map(
function (ReflectionParameter $dependency) {
// Busca no container a referência da classe desse parâmetro
return $this->get(
$dependency->getClass()->getName()
);
},
$constructor->getParameters()
));
}
public function singleton(string $id, Closure $closure) : void
@@ -31,4 +59,9 @@ public function singleton(string $id, Closure $closure) : void
return $resolvedInstance;
};
}
public function has(string $id) : bool
{
return isset($this->instances[$id]);
}
}
@@ -21,10 +21,6 @@
return new UserRepository();
});
$userController = new UserController(
$container->get(TagRepository::class),
$container->get(UserRepository::class),
$container->get(LeadRepository::class)
);
/** @var UserController $userController */
$userController = $container->get(UserController::class);
$userController->index();

0 comments on commit ae6cce1

Please sign in to comment.
You can’t perform that action at this time.