Serviço no Laravel 12, como Criar e Utilizar

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