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?