5

Nel mio progetto standalone (senza Laravel) voglio utilizzare il contenitore Illuminate IoC. Vorrei anche accedere al contenitore dell'app attraverso la facciata App fornita dal componente illuminate/support. Ho installato entrambi i componenti (v5.0.28). Qui è il mio codice (semplificato):Come creare Illuminate/Supporto/Facciata/Facciata per app standalone Illuminated 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'); 

Purtroppo, cercando di legare qualcosa si traduce in:

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

Ecco il codice su quella linea

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

Dove $instance è un'istanza di Illuminate\Support\Facades\App, $method == 'bind', $args[0] == 'w' e $args[1] == 'Widget'. Il problema è che $instance non è un'istanza di Illuminate\Container\Container e la classe non ha alcun supporto per la chiamata di funzioni arbitrarie sulla sua proprietà statica $app.

Per farlo funzionare ho aggiunto la seguente funzione a Illuminate\Support\Facades\App:

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

Ma sicuramente la modifica di componente esterno non è la cosa giusta da fare !!! Sicuramente qualcuno l'ha già incontrato prima!

Quindi la domanda è: qual è il modo corretto per farlo?

risposta

1

Manca un componente chiave. La classe Application deve essere associata al contenitore. The Facade sta cercando una classe da associare a 'app', ma nulla è, quindi il tuo errore. Puoi risolvere il problema legando la classe Illuminate\Container\Container a "app":

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'); 
Problemi correlati