Я могу с успехом использовать следующий код для отправки писем от контроллера:
$message = \Swift_Message::newInstance() ->setSubject('Hello Email') ->setFrom('send@example.com') ->setTo('recipient@example.com') ->setBody($this->renderView('HelloBundle:Hello:email.txt.twig', array('name' => $name))) ; $this->get('mailer')->send($message);
Как мне изменить код, чтобы использовать его из класса сервиса?
У вашего сервиса есть внешняя зависимость, особенно служба почтовой службы. Вы можете либо ввести сам контейнер службы, либо ввести службу почтовой программы.
Если вашему сервису требуется только служба почтовой рассылки, и ничего больше, я бы предложил ввести только почтовую службу.
Вот как вы бы настроили DIC, чтобы внедрить почтовую службу с помощью сеттера:
<service id="my.service" class="Acme\DemoBundle\Service\Hello"> <call method="setMailer"> <argument type="service" id="mailer" /> </call> </service>
В своем классе напишите свой сеттер:
class Hello { protected $mailer; public function setMailer($mailer) { $this->mailer = $mailer; } public function sendEmail() { $message = \Swift_Message::newInstance() ->setSubject('Hello Email') ->setFrom('send@example.com') ->setTo('recipient@example.com') ->setBody($this->renderView('HelloBundle:Hello:email.txt.twig', array('name' => $name))) ; $this->mailer->send($message); } }
Примечание. Вы должны будете отобразить свой шаблон в своем контроллере и перейти к этой функции электронной почты, или добавить шаблонный сервис и рендеринг в свою службу.
Это зависит от того, как вы объявили услугу. Если вы передаете ему весь контейнер обслуживания, вам ничего не нужно будет менять, иначе вам понадобится, по крайней мере, почтовая программа и служба шаблонов, переданные ей и вызванные более прямо ( $this->get('service')
приведет к смертельному исходу ошибка sinc это зависит от container
)