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,

2 réponses


Salut,
$app->set('Foo', function($app){
return new Bar("Chien", $app->get(\Foo::class));
});

es-tu vraiment sûr que pour la classe bar tu as le bon namespace ??
@plus

Pierre

+1 Pierrot01
Je pense que tu as oublier le namespace dans la class Bar car de toute façons si tu suis le PSR-4 tu devrais avoir un truc comme :

new \Framework\Test\Bar

PS: Au vu des questions posées sur les forums, je pense que ce que tu fais est encore d'un niveau trop haut pour toi. La base du dev c'est d'abord de savoir lire et comprendre les erreurs et le code que l'on fait.