2016-08-03 17 views
0

Ich versuche, eine einfache Abhängigkeit "Mapper" zu machen, ich glaube nicht, dass ich es sogar einen Abhängigkeitsinjektor nennen kann ... also habe ich versucht, einen minimalen Beweis des Konzepts unten zu machen.Zugreifen auf Abhängigkeiten mit einer Foreach-Schleife

auf meiner Seite index.php folgendes ich habe ...

// >>> psr-4 autoloader here 

// instantiating the container 
$container = new Container; 

// getting an instance of 'A' with an object tree of A->B->C 
$a = $container->get('A'); 

In meinem einfachen Behälter ich diese haben ...

class Container 
{ 
    public $dependencies = []; // an array of dependencies from the dependency file 

    public function __construct() 
    { 
     // include list of dependencies 
     include 'Dependencies.php'; 

     foreach ($dependency as $key => $value) { 
      $this->dependencies[$key] = $value; // e.g. dependency['A'] = ['B']; 
     } 
    } 

    /** 
    * gets the dependency to instantiate 
    */ 
    public function get($string) 
    { 

     if (isset($this->dependencies[$string])) { 

      $a = $string; 

      foreach ($this->dependencies[$string] as $dependency) { 

       $b = $dependency; 

       if (isset($this->dependencies[$dependency])) { 

        foreach ($this->dependencies[$dependency] as $dependency); 

        $c = $dependency; 

       } 

      } 

     } 

     $instance = new $a(new $b(new $c)); 
     return $instance; 

    } 
} 

Ich habe meine Abhängigkeiten in einem separaten vorgezeichnet Datei, die wie folgt aussieht ...

/** 
* to add a dependency, write the full namespace 
*/ 

$dependency['A'] = [ 
    'B' // A depends on B 
]; 

$dependency['B'] = [ 
    'C' // which depends on C 
]; 

und eine Reihe von Klassen, A, B und C, die hängen von ihnen ...

class A 
{ 
    public function __construct(B $b) 
    { 
     echo 'Hello, I am A! <br>'; 
    } 
} 



class B 
{ 
    public function __construct(C $c) 
    { 
     echo 'Hello, I am B!<br>'; 
    } 
} 



class C 
{ 
    public function __construct() 
    { 
     echo 'Hello, I am C! <br>'; 
    } 
} 

Ich habe den ganzen Nachmittag versucht, etwas zu bekommen, zu arbeiten, aber ich habe Angst, entweder ich nicht klar genug denke

Frage

Also in meinem get() Funktion, wie kann ich machen Das Laden dieser Abhängigkeiten automatisch, so dass meine Funktion erhalten ist nicht nur ein nie endendes Nest von foreach und iffelse Anweisungen ... muss ich eine Art von Rückruf hinzufügen? Es ist wirklich nicht klar für mich, und ich muss betonen, dass ich eine ganze Reihe verschiedener Ansätze ausprobiert habe, die nicht funktionierten, zu viele, um sie einzubeziehen.

+1

warum verwenden Sie Setklasse Strukturen und die irgendwo anstatt autowiring Speicher (wie vorgeschlagen [hier] (http://stackoverflow.com/questions/38702676/what-is-a-dependency-injection-container/38706152# 38706152)). autowiring mit Reflection-Klassen ermöglicht es PHP, Abhängigkeiten automatisch zu erkennen, anstatt sie aus einem Array/einer Datei auszulesen. – jeremy

Antwort

1

Sie tun es falsch. Ihr Container ist so konzipiert, dass er nur mit dieser Abhängigkeitsstruktur funktioniert. Zum Beispiel funktioniert $container->get('B') nicht, weder $container->get('C'), weil $c wird Null und dritte verschachtelte new wird fehlschlagen.

Ich schlage vor, dass Sie Ihren Container als recursive Funktion machen.

BTW, was ist mit der dritten foreach? Versuchen Sie, die letzte Abhängigkeit zu bekommen?

Sie können meine article lesen.

+0

Vielen Dank für diese Antwort ... Ich habe gestern angefangen, Rekursion zu betrachten und es ergibt Sinn. Ich gehe sorgfältig durch Ihren Artikel und diesen Artikel auch ... http://krasimirtsonev.com/blog/article/Dependency-Injection-in-PHP-example-how-to-DI-create-your-own- Abhängigkeits-Injektions-Container –