2012-05-21 17 views
13

Non capisco come viene utilizzato questo "contenitore DI". Gli esempi mostrati sul sito ufficiale non mi dicono nulla: http://pimple.sensiolabs.orgInformazioni sul brufolo

Fondamentalmente ho un sito semplice, che consiste in un insieme di classi: la classe DB, la classe Cache, la classe User e altre ancora che gestiscono i tipi di contenuto.

Tutte queste classi sono come i "servizi" menzionati in Pimple e ogni servizio dovrebbe essere in grado di chiamare un altro servizio. In questo momento sto istanziando i servizi in una classe principale che io uso come un singleton per condividere servizi attraverso altre classi.

Da quello che ho letto, Pimple fa esattamente questo genere di cose, ma come lo uso? : s

risposta

18

Esiste un tutorial su http://phpmaster.com/dependency-injection-with-pimple/ che spiega come utilizzare Pimple come DIC.

Un altro (ma non necessariamente consigliato) approccio è quello di iniettare il contenitore in tutti i componenti che ne hanno bisogno (ad esempio lo si usa come un ServiceLocator) e quindi si fa semplicemente quello che la documentazione dice che dovresti fare per ottenere un oggetto da pimple:

class SomeClassThatNeedsSession 
{ 
    private $session; 
    public function __construct(Pimple $container) 
    { 
     $this->session = $container['session']; 
    } 
} 

In altre parole, basta portare ciò che è necessario e Pimple will handle the lifetime of that object, e.g. whether it needs to be created or is reused. OffsetGet fa parte dell'interfaccia ArrayAccess che consente di accedere a un oggetto come una matrice, quindi quando lo fai, $container['foo'] Pimple controllerà se ha una chiusura definita per foo se si tratta solo di alcuni parametri e di assemblare il servizio di conseguenza.

Pimple era il risultato di un blog post about Lambdas and Closures che potresti voler leggere per capire meglio come funziona.

+4

È considerata una buona pratica dare a una classe l'intero contenitore? Non violare leggermente la legge di demeter per cui stai dando una lezione più di quanto debba fare il suo lavoro? – AgmLauncher

+2

@AgmLauncher Law of Demeter non si applica ai metodi che creano oggetti in base alla carta originale su LoD. Dal momento che un localizzatore di servizi è effettivamente una fabbrica che crea oggetti, in realtà non sta violando LoD. Tuttavia, tutte le classi che utilizzano un Localizzatore di servizio avranno una dipendenza dalla SL, che ostacola il riutilizzo, quindi è meglio non usarlo come tale ma seguire l'uso suggerito nel primo link che ho fornito. – Gordon

+1

Se si inietta l'intero contenitore Pimple nel costruttore, come possiamo dire quali sono le vere dipendenze per la classe SomeClassThatNeedsSession? Come potrei sapere quali dipendenze deridere per i test? –

4

Non conosco Pimple, ma il motore DI che conosco prende l'istanziamento dalle mani. I tuoi oggetti non creano istanze delle loro dipendenze. Invece, il motore DI li crea e li distribuisce su richiesta.

Quindi, se il codice PHP crea nuove istanze, penso che dovresti cambiarlo in modo che il codice ottenga il motore DI e chieda le dipendenze da esso.

+0

Il brufolo è solo un contenitore, non un motore, non può gestire l'istanziazione. – erdeszt

+2

Quindi, chi crea un'istanza per Pimple? Non vedo il punto se non può creare oggetti. – duffymo

+1

Configura il brufolo con le chiusure per fare le istanze per te. Brufolo gestirà le dipendenze tra gli oggetti e istanzia ogni pigramente, cioè solo quando necessario. – Jason

Problemi correlati