Inject SwiftMailer into symfony2 service

Andrew Atkinson picture Andrew Atkinson · Jan 16, 2013 · Viewed 11.5k times · Source

I have a service which extends UserManager, so when I do:

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

I get the error:

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

I know this is because I need to inject the swiftmailer into here, but how? (usually the service class extends 'Generic' so the swift mailer is included.)

Answer

Schwierig picture Schwierig · Jan 16, 2013

Depending on what kind of service file you are using you need to inject it into your service directly like you said.

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]

You can simply grab the service in your constructor like this. Or if you really want, you can inject the service_container. But that's really dirty, since you can just inject the services you need.

Injection the service_container is only needed if you need a dynamic service call.