2016-08-08 26 views
0

Ich habe eine einfache (glaube ich).Implodieren von Array von Objekten

Ich habe eine Silex-Anwendung ... Ich habe eine Service-Services.yml-Datei erstellt, mit meinen Diensten mit ihren Argumenten. Von coruse können Argumente Instanz von anderen Klassen sein:

services: 
    Service: 
     class: App\Services\xxxxxService 
     arguments: 
     - App\Lib\Parser\JsonParser 
     - xxxxxx 

Also, meiner init-Anwendung, ich habe dieses Stück Code:

$services = $this['config']['services']; 

    foreach ($services as $name => $service) { 
     $className = $service['class']; 

     $args = array_map(function ($arg) { 
      if(class_exists($arg)){ 
       return new $arg; 
      } else { 
       return $arg; 
      } 
     }, $service['arguments']); 
     $args = implode(',', $args); 

     $this[$name] = new $className($this, $args); 
    } 

Dieser Code gibt mir den Fehler:

Behebbarer fataler Fehler: Objekt der Klasse App \ Lib \ Parser \ JsonParser konnte in Zeile/252

nicht in string in /app/src/Application.php konvertiert werden. Mein Ziel ist $ $ [$ name] = new $ Klassenname ($ th ist, $ args [0], $ args [1] ....), aber ich kann die Implodefunktion nicht benutzen.

Irgendwelche Ideen ???

Vielen Dank im Voraus!

M.

Antwort

1

Ich schlage vor, ReflectionClass zu benutzen, um Ihre $className

zu instanziiert Nachdem Sie sammeln alle Ihre $args nicht verwenden implode Methode, da es nicht richtig die args Klasse Konstruktor übergeben kann. So

Sie haben $args als array

array_unshift($args, $this); # Prepend $this in args 
$refl = new ReflectionClass($className); 
$this[$name] = $refl->newInstanceArgs($args); #Instatiate $className with appropriate args. 
+0

Yesss !!! ... die Reflexion macht den Trick! +1 für dich! Denken Sie, Reflection ist zu teuer in Bezug auf die Speichernutzung? Betrachte meinen Code, glaubst du, ich bin dabei? .... Ich habe einen Application-Wrapper von Silex \ Application, und bevor ich das starte, starte ich alle Controller, die Parameter und Dienste in $ app, das ist eine Instanz von Pimple. Also in meiner Anwendung habe ich jetzt $ app ['myService'] und ich kann überall wiederverwenden. – Mauro

+0

Sie versuchen, ein DependencyInjection-Tool zu erstellen. Obwohl es viele von ihnen gibt, ist es nicht schlecht, eigene zu bauen, da Sie eine Menge Dinge im Prozess lernen können. Für die Leistung ist es besser, Ihre Anwendung zu benchmarken und dann zu profilieren, wenn Sie denken, dass es langsam ist. In der Profilerstellung sehen Sie, wo Engpässe liegen. ReflectionClass wird auch von Symfony DI verwendet, und ich denke, das ist das einzige wawy in PHP, um aus Argumenten eine Klasseninstanz zu erstellen. – Whiteulver