2013-01-16 8 views
10

Ho un servizio che si estende UserManager, così quando lo faccio:Iniettare SwiftMailer in servizio Symfony2

$message = \Swift_Message::newInstance() 
      ->setSubject('~') 
      ->setFrom('~') 
      ->setTo('~') 
      ->setBody('~', 'text/html'); 
     $this->get('mailer')->send($message); 

ottengo l'errore:

Fatal error: Call to undefined method My\MyBundle\Service\ServiceClass::get() 

So che questo è perché ho bisogno di iniettare il swiftmailer qui, ma come? (in genere la classe di servizio estende "Generico", quindi è incluso il bollettino rapido.)

risposta

18

A seconda del tipo di file di servizio che si sta utilizzando, è necessario immetterlo direttamente nel servizio come si è detto.

XML:

<services> 
     <service id="sample.service" class="%sample.service.class%"> 
      <argument type="service" id="mailer" /> 
     </service> 
</services> 

YAML:

services: 
    sample.service: 
     class:  %sample.service.class% 
     arguments: [@mailer] 

Si può semplicemente prendere il servizio nel costruttore come questo. Oppure, se lo desideri, puoi iniettare lo service_container. Ma è molto sporco, dal momento che puoi semplicemente iniettare i servizi di cui hai bisogno.

Iniezione il service_container è necessario solo se è necessaria una chiamata di servizio dinamica.

+0

Ho aggiunto il servizio nel file .yml ma non sono sicuro di come chiamarlo nel costruttore della classe? –

+2

Basta aggiungere un parametro al costruttore, come 'public function __construct ($ mailer)' e quindi ad es. assegnarlo a una proprietà privata nel corpo del costruttore. –

+1

una guida dummys: aggiungi il servizio come risposta sopra. Quindi aggiungere al costruttore come sopra commento. quindi aggiungi '$ this-> mailer = $ mailer;' nel costruttore. È quindi possibile utilizzare: '$ this-> mailer-> send ($ message);' –