5

In meinem Standalone (ohne Laravel) Projekt möchte ich Illuminate IoC Container verwenden. Auch möchte ich auf den App-Container durch App Fassade von illuminate/support Komponente zur Verfügung gestellt zugreifen. Ich habe beide Komponenten installiert (v5.0.28). Hier ist meine (vereinfacht) Code:So erstellen Sie Illuminate/Support/Fassade/App Fassade für Standalone Illuminate IoC Container

function setup_App(){ 
    $container = new Illuminate\Container\Container(); 
    Illuminate\Support\Facades\Facade::setFacadeApplication($container); 
    class_alias('Illuminate\Support\Facades\App', 'App'); 
} 

setup_App(); 

App::bind('w', 'Widget'); 
$widget = App::make('w'); 

Leider versuchen, etwas zu binden, führt zu:

Fatal error: Call to undefined method Illuminate\Support\Facades\App::bind() in ...\illuminate\support\Facades\Facade.php on line 213 

Hier ist der Code auf dieser Linie ist

$instance = static::getFacadeRoot(); 
... 
return $instance->$method($args[0], $args[1]); // <--- line 213 

Wo $instance ist eine Instanz von Illuminate\Support\Facades\App, $method == 'bind', $args[0] == 'w' und $args[1] == 'Widget'. Das Problem ist, dass $instance ist keine Instanz von Illuminate\Container\Container und Klasse Illuminate\Support\Facades\App hat keine Unterstützung für den Aufruf beliebiger Funktionen auf seine statische Eigenschaft $app.

Um es i funktioniert hinzugefügt, um die folgende Funktion Illuminate\Support\Facades\App:

public function __call($method , array $arguments) { 
    return call_user_func_array(array(static::$app, $method), $arguments); 
} 

Aber sicher externe Komponente Bearbeitung ist nicht das Richtige zu tun !!! Sicherlich ist jemand schon einmal darauf gestoßen!

Die Frage ist also: Was ist der richtige Weg, dies zu tun?

Antwort

1

Ihnen fehlt eine Schlüsselkomponente. Die Application Klasse muss an den Container gebunden werden. Die Fassade sucht nach einer Klasse, die an "App" gebunden ist, aber nichts ist, daher Ihr Fehler. Sie können das Problem beheben, indem Sie die Klasse Illuminate\Container\Container an 'app' binden:

function setup_App(){ 
    $container = new Illuminate\Container\Container(); 
    Illuminate\Support\Facades\Facade::setFacadeApplication($container); 
    $container->singleton('app', 'Illuminate\Container\Container'); 
    class_alias('Illuminate\Support\Facades\App', 'App'); 
} 

setup_App(); 

App::bind('w', 'Widget');