Sto capendo il numero DI
e IoC
; utilizzando Pimple per ora. Diciamo che ho il mio IoC definito all'inizio nell'esecuzione flussoModo corretto per passare il contenitore IoC
$container = new Injection\Container();
$container['config'] = function ($c) {
return new Config($c['loader']);
};
$container['request'] = function ($c) {
return new Request($c['config']);
};
...
E una classe router che call_user_func_array
//$class = 'Dog', $method = 'woof', $this->args = ['foo', 'bar']
call_user_func_array(array(new $class, $method), $this->args);
Quindi nuovo oggetto viene creata un'istanza senza essere a conoscenza del IoC
ma ancora vorrei riutilizzare alcuni dei servizi definiti.
class Dog
{
public function woof($var1, $var2)
{
//$request = IoC service here
}
}
La mia domanda è:
- Quale sarebbe il modo corretto per passare il
IoC
alla classe (statica sembra essere il male ...) o - E 'anche necessario superare il contenitore intorno e altri metodi/concetti esistono?
leggere alcuni articoli piacevoli, tuttavia, non è stato in grado di capirlo
Aggiornamento
Il male modo I ha fatto che definiva un altro servizio che salva il IoC
in una proprietà statica
$container['services'] = function ($c) {
return Services::create($c); //make the service
};
$container['services']; //call the service
e accedervi in seguito in aggiornamento
class Dog
{
public function woof($var1, $var2)
{
$services = new Services();
$request = $services['request']; //retrieving the request service
}
}
ha deciso di utilizzare il modo meno dannoso
//passing the container here
call_user_func_array(array(new $class($container), $method), $this->args);
e memorizzare i parametri in __constructor
public $container;
public function __construct(Injection\Container $container)
{
$this->container = $container;
}
Grazie ed è d'accordo con te; anche "In DI, non si passa mai il contenitore a una classe a meno che quella classe non sia parte della composizione root." e "Con DI, le dipendenze di una classe sono esplicite quindi non è necessario guardare oltre i parametri del costruttore". si applica al mio caso.Ok, ma cosa succede se la classe dipende da servizi che sono ancora sconosciuti? Iniezione setter? – sitilge
'Cosa succede se la classe dipende da servizi che sono ancora sconosciuti?' - L'uso di IoC riguarda la programmazione di * astrazioni *, non * tipi di calcestruzzo *. Ciò aiuta in molti modi, ma principalmente in modo da poter fornire un modo per future classi concrete sconosciute da collegare senza modificare il codice. Rende anche possibile creare mock per il test. Finché la classe aderisce al contratto astratto (solitamente un'interfaccia), questo è possibile. Vorrei fornire uno snippet, ma non ho familiarità con PHP ... – NightOwl888
grazie, ma questo non risolve il problema dal momento che sto usando 'call_user_func_array' e solo le cose che vengono passate sono parametri url. – sitilge