Crear servicios en symfony 4

Los servicios están bien para encapsular código que se repite en nuestra plataforma.

En el fichero services.yaml incluimos la clase y le pasamos al constructor los necesarios

// config/services.yaml
services:
    App\Service\Email:
        arguments: ["@mailer", "@twig"]

A partir de la versión de Symfony 3.X los servicios los inyecta el autoloader. Por eso tenemos que incluir su clase en nuestro controlador. A diferencia de la versión anterior que se usaban los containers.

// src/Controller/dashboardController.php

use App\Service\Email;

Necesitamos usar el servicio Email en nuestro método example que se encuentra en el controlador dasboardController.php

// src/Controller/dashboardController.php
/**
 * @Route("/example", name="demo")
 */
public function example(Email $email): Response{

    $mailer = $email->sendCambios(['user@domain.es']);
    return $this->render('dashboard/index.html.twig');
}

Creamos la clase de nuestro servicio encargada de enviar emails. En el constructor le pasamos la clase encargada del email y la renderizacion de las vistas para los emails.

// src/Service/Email.php

namespace App\Service;

class Email{

    public function __construct(\Swift_Mailer $mailer, \Twig_Environment $templating){
        $this->mailer = $mailer;
        $this->templating = $templating;
    }

    public function sendCambios($emails){

        // Recorro los emails 
        foreach ($emails as $key => $email){
            $transport = (new \Swift_SmtpTransport('smtp.1and1.es', '465', 'ssl'))
                      ->setUsername('example@domain.es')
                      ->setPassword('contrasena');

            $mailer = new \Swift_Mailer($transport);
            $message = (new \Swift_Message('Un alumno solicito un cambio'))
                        ->setFrom('noreply@domain.es','Titulo del correo')
                        ->setTo($email)    
                        ->setBody(
                            $this->templating->render('email/sendCambios.html.twig'),
                            'text/html');
            if(!$mailer->send($message)){
                return false;
            }
        }

        return true;
    }
}

Creamos la vista de los correos en html. Esta vista puede recibir parámetros y usarlo como cualquier pagina usando el segundo parámetro del método render

// templates/email/sendCambios.html.twig

<html>
	<head></head>
	<body>
		Lorem ipsum dolor sit amet, consectetur adipiscing elit.
	</body>
</html>