Bonjour,
Voila je rencontre un petit problème avec mon code.
J'ai suivi le cours de Grafikart sur la gestion des DIC : https://www.grafikart.fr/tutoriels/conteneur-injection-dependance-606
J'ai juste tout re-organisé dans des dossiers. Et depuis j'ai cette erreur que je n'arrive pas à corriger :
Ce que j'obtiens
Fatal error: Uncaught ReflectionException: Class Bar does not exist in C:\xampp\htdocs\Dependancy\Components\DIC\DIC.php:65
Stack trace:
#0 C:\xampp\htdocs\Dependancy\Components\DIC\DIC.php(65): ReflectionClass->__construct('Bar')
#1 C:\xampp\htdocs\Dependancy\Components\DIC\DIC.php(52): Components\DIC\DIC->resolve('Bar')
#2 C:\xampp\htdocs\Dependancy\index.php(13): Components\DIC\DIC->get('Bar')
#3 {main}
thrown in C:\xampp\htdocs\Dependancy\Components\DIC\DIC.php on line 65
Ce que je veux
Que cela fonctionne ! xD
Différents fichiers
Je tiens à préciser que toutes mes classes ont les bon namespaces.
Voici mon architecture :
(Je me suis dit qu'avec une image, ce serait plus simple ! :D)
http://www.noelshack.com/2018-51-7-1545519617-screenshot-4.png
DIC :
<?php
namespace Components\DIC;
class DIC{
private $registry = [];
private $factories = [];
private $instances= [];
/**
* Ajoute un élément dans le conteneur
* @param $key
* @param callable $resolver
*/
public function set($key, Callable $resolver){
$this->registry[$key] = $resolver;
}
/**
* Ajoute un élément qui sera instancié à chaque appel
* @param $key
* @param callable $resolver
*/
public function setFactory($key, Callable $resolver){
$this->factories[$key] = $resolver;
}
/**
* Ajoute une instance à notre conteneur, la clef sera le nom de la class
* @param $instance
*/
public function setInstance($instance){
$reflection = new \ReflectionClass($instance);
$this->instances[$reflection->getName()] = $instance;
}
/**
* Récupère une instance à partir de la clef
* @param $key
* @return mixed
* @throws Exception
*/
public function get($key){
if(isset($this->factories[$key])){
return $this->factories[$key]();
}
if(!isset($this->instances[$key])){
if(isset($this->registry[$key])){
$this->instances[$key] = $this->registry[$key]($this);
} else {
$this->instances[$key] = $this->resolve($key);
}
}
return $this->instances[$key];
}
/**
* Instancie la classe à partir de son nom
* @param $key
* @return object
* @throws Exception
*/
private function resolve($key){
$reflected_class = new \ReflectionClass($key);
if($reflected_class->isInstantiable()){
$constructor = $reflected_class->getConstructor();
if($constructor){
$parameters = $constructor->getParameters();
$constructor_parameters = [];
foreach($parameters as $parameter){
if( $parameter->getClass() ){
$constructor_parameters[] = $this->get($parameter->getClass()->getName());
} else {
$constructor_parameters[] = $parameter->getDefaultValue();
}
}
return $reflected_class->newInstanceArgs($constructor_parameters);
} else {
return $reflected_class->newInstance();
}
} else {
throw new Exception($key . " is not an instanciable Class");
}
}
}
index.php
<?php
require 'vendor/autoload.php';
echo '<pre>';
$app = new \Components\DIC\DIC();
$app->set('Foo', function($app){
return new Bar("Chien", $app->get(\Foo::class));
});
var_dump($app->get('Bar'));
echo '</pre>';
Je vous remercie d'avance.
Cordialement,