Resumo do Problema
Vamos imaginar um cenário em que você está desenvolvendo uma aplicação no Laravel 12 e precisa implementar uma funcionalidade para enviar e-mails de notificação aos usuários, de forma personalizada. No entanto, você percebe que essa lógica de envio de e-mails pode ser reutilizada em diferentes partes da aplicação. Para manter o código limpo, modular e de fácil manutenção, é ideal extrair essa lógica em um serviço dedicado.
Neste artigo, vou mostrar como criar e utilizar um serviço no Laravel 12 para enviar e-mails personalizados. Vamos percorrer o processo de criação do serviço e como integrá-lo ao código da aplicação, utilizando a versão mais recente do Laravel e PHP 8.2.
O que é um Serviço no Laravel?
No Laravel, um serviço é uma classe que contém lógica de negócios que pode ser reutilizada em diferentes partes da aplicação. Normalmente, esses serviços são usados para separar funcionalidades específicas, como envio de e-mails, manipulação de arquivos, interações com APIs externas, entre outras.
No nosso caso, criaremos um serviço para o envio de e-mails de notificação. Isso ajuda a isolar a lógica de e-mails, mantendo o código organizado e mais fácil de testar.
Passo 1: Criando o Serviço
Primeiro, vamos criar uma classe de serviço que será responsável pelo envio de e-mails. No Laravel, podemos criar um serviço em qualquer diretório dentro de app/. A convenção mais comum é criar uma pasta chamada Services dentro de app/, mas você pode escolher o nome que achar mais adequado.
Comando para Criar a Classe de Serviço
Abra o terminal no diretório da sua aplicação Laravel e execute o comando:
php artisan make:service EmailService
Este comando cria um arquivo chamado EmailService.php em app/Services. Então vamos editar esse arquivo para adicionar a lógica de envio de e-mail.
Exemplo de Implementação do Serviço
Edite o arquivo app/Services/EmailService.php para se parecer com o seguinte:
<?php
namespace App\Services;
use Illuminate\Support\Facades\Mail;
use App\Mail\NotificationMail;
class EmailService
{
/**
* Envia um e-mail de notificação para o usuário.
*
* @param string $toEmail
* @param string $subject
* @param string $message
* @return void
*/
public function sendNotificationEmail(string $toEmail, string $subject, string $message)
{
Mail::to($toEmail)->send(new NotificationMail($subject, $message));
}
}
Neste exemplo, estamos utilizando a facade Mail do Laravel para enviar o e-mail. A classe NotificationMail é uma Mailable personalizada que você precisará criar (vamos abordar isso mais adiante).
Passo 2: Criando a Classe Mailable
No exemplo acima, estamos utilizando uma Mailable para enviar o conteúdo do e-mail. As Mailables são classes responsáveis por construir os e-mails e enviar as informações necessárias (assunto, corpo, remetente, etc.).
Comando para Criar a Classe Mailable
Execute o seguinte comando para criar uma classe Mailable:
php artisan make:mail NotificationMail
Isso criará um arquivo em app/Mail/NotificationMail.php. Agora, edite este arquivo para incluir a lógica do e-mail:
<?php
namespace App\Mail;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class NotificationMail extends Mailable
{
use SerializesModels;
public $subject;
public $message;
/**
* Cria uma nova instância da mensagem.
*
* @param string $subject
* @param string $message
*/
public function __construct(string $subject, string $message)
{
$this->subject = $subject;
$this->message = $message;
}
/**
* Construa a mensagem do e-mail.
*
* @return $this
*/
public function build()
{
return $this->view('emails.notification')
->with([
'subject' => $this->subject,
'message' => $this->message,
]);
}
}
Essa classe usa o método view para renderizar um arquivo de visualização (view) do Laravel que contém o corpo do e-mail.
Criando a View do E-mail
Agora, crie a view resources/views/emails/notification.blade.php, que será utilizada pelo NotificationMail para compor o e-mail:
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ $subject }}</title>
</head>
<body>
<h1>{{ $subject }}</h1>
<p>{{ $message }}</p>
</body>
</html>
Essa view será usada para renderizar o e-mail com o assunto e mensagem que passamos ao chamar o serviço.
Passo 3: Registrando o Serviço no Container de Dependências
O Laravel usa um contêiner de injeção de dependências para gerenciar as classes e seus objetos. Para que possamos utilizar nosso EmailService em qualquer lugar da aplicação, precisamos registrá-lo no contêiner de serviços do Laravel.
Você pode fazer isso no arquivo app/Providers/AppServiceProvider.php, dentro do método register.
Abra o arquivo AppServiceProvider.php e registre o serviço da seguinte forma:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Services\EmailService;
class AppServiceProvider extends ServiceProvider
{
/**
* Registre serviços no contêiner.
*
* @return void
*/
public function register()
{
$this->app->singleton(EmailService::class, function ($app) {
return new EmailService();
});
}
//...
}
Passo 4: Utilizando o Serviço na Aplicação
Agora que o serviço foi criado e registrado, podemos utilizá-lo em qualquer parte da nossa aplicação. Vamos, por exemplo, chamá-lo dentro de um controlador para enviar um e-mail quando um usuário se registrar.
Exemplo de Utilização no Controlador
No seu controlador, injete a classe EmailService no construtor e use o método sendNotificationEmail para enviar o e-mail:
<?php
namespace App\Http\Controllers;
use App\Services\EmailService;
use Illuminate\Http\Request;
class UserController extends Controller
{
protected $emailService;
/**
* Criação de instância do controlador.
*
* @param EmailService $emailService
*/
public function __construct(EmailService $emailService)
{
$this->emailService = $emailService;
}
/**
* Registra o usuário e envia o e-mail de notificação.
*
* @param Request $request
* @return \Illuminate\Http\Response
*/
public function register(Request $request)
{
// Lógica de registro do usuário (exemplo simplificado)
$user = User::create($request->all());
// Enviar e-mail de notificação
$this->emailService->sendNotificationEmail($user->email, 'Bem-vindo!', 'Seu cadastro foi realizado com sucesso.');
return response()->json('Usuário registrado com sucesso.');
}
}
Neste exemplo, sempre que um usuário for registrado, o método sendNotificationEmail será chamado para enviar um e-mail de boas-vindas.
Conclusão
Neste artigo, aprendemos como criar e utilizar um serviço no Laravel 12, com foco no envio de e-mails personalizados. Criamos uma classe de serviço que encapsula a lógica de envio de e-mails, uma Mailable para formatar o conteúdo do e-mail e mostramos como registrar o serviço no contêiner de dependências do Laravel. Por fim, utilizamos o serviço em um controlador para enviar e-mails sempre que um novo usuário for registrado.
Essa abordagem permite que a lógica de e-mails seja isolada e reutilizável, mantendo a aplicação mais organizada e de fácil manutenção.
A documentação oficial do Laravel pode ser encontrada no link a seguir: https://laravel.com/docs/12.x/container