2012-07-10 9 views
7

Attualmente ho un'istanza del contenitore DI di Symfony2 pronta con un servizio e tutte le sue dipendenze. Diciamo per esempio che ho una classe di auto e ha motore e luci come dipendenze.Dipendenze di caricamento lenta con symfony DI

Nella mia configurazione corrente entrambe queste dipendenze vengono create automaticamente tramite l'iniezione setter quando viene creato l'oggetto Car, ma potrebbe benissimo essere che il mio oggetto Auto non avrà bisogno delle sue luci questa volta quindi non ha bisogno esplicitamente per creare un'istanza di questa dipendenza.

C'è un modo per ottenere questo in Symfony DI? Quindi, solo creando un'istanza dell'oggetto Lights quando necessario? La mia ipotesi è che sarà una sorta di implementazione Proxy come Doctrine ma, per quanto ho visto, non esiste in DI di Symfony.

risposta

2

iniettare il dedendencies che sono obbligatori per il costruttore tramite il vostro services.yml, automaticamente.
Se si dispone di dipendenze opzionali, inserirle tramite un setter nel controller quando sono necessarie.

$this->container->get('cars')->setLights(new \Namespace\Lights()); 

Naturalmente la classe cabine devono essere progettate in questo modo e si deve dirigere le iniezioni nel controller, o dovunque necessario, il codice.

1

Una domanda molto interessante, ma non penso sia possibile all'interno del contenitore di iniezione delle dipendenze di Symfony2. Il contenitore è solo a conoscenza di ciò che gli dici: in questo caso, hai una dipendenza che è subordinata a un caso d'uso specifico. Inoltre, la registrazione dei servizi avviene presto nella vita dell'app, quindi non vedo come potresti farlo funzionare.

Forse dovresti usare il modello di fabbrica. Registrare un CarFactory come servizio e quindi quando si preleva un'istanza Car, è possibile specificare che deve includere una dipendenza Light.

Posso chiederti perché vuoi raggiungere questo obiettivo? Potrebbe esserci una soluzione più semplice.

+0

Beh, nel mio caso sto implementando il componente DI autonomamente in un progetto ZF precedente. Ho diverse classi di servizi (AdminService, UserService, ...) che hanno tutte dipendenze come DBAL, ACL, ecc ... Questi sono i requisiti effettivi per il corretto funzionamento della classe di servizio. D'altra parte ci sono istanze come una forma e un modello che vengono utilizzati solo in alcuni dei metodi di ServiceClass. Queste sono le dipendenze "condizionali". Sto pensando che è anche praticamente impossibile a meno che Symfony DI abbia un sistema proxy come la dottrina che usa per le sue Entità. – ChrisR

0

Non è una soluzione alternativa, ma è possibile provare a iniettare l'intera DIC, quindi ottenere i servizi Light e Engine quando necessario.

Stavo pensando a qualcosa di simile a questo metodo nella classe Car:

protected function getLightService() 
{ 
    if (!$this->light) { //so we reuse the first instance 
     $this->light = $this->dic->get("car.light"); 
    } 

    return $this->light; 
} 
+0

Attualmente non sto iniettando il contenitore DI ma facendo riferimento a ZF FrontController in questo modo: 'Zend_Controller_Front :: getInstance() -> getParam ('bootstrap') -> getDic()'. Qualche ragione per non farlo in questo modo? – ChrisR

+0

Non ho esperienza con ZF, quindi non posso rispondere. Se funziona bene per te, immagino sia ok. – Maerlyn

2

La domanda ha già una risposta, ma per chi ha bisogno di questa funzionalità, i servizi pigri sono implementati in Symfony 2.3.

È necessario installare ProxyManager bridge.

È possibile trovare la documentazione ufficiale here.

Problemi correlati