Cómo Personalizar la Notificación de Laravel Breeze

Spread the love

Si ya estas trabajando con Laravel 8 y el paquete Breeze para la autentificación, es muy probable que te hayas dado cuenta que la notificación del paquete no esta disponible para modificarse fuera de vendor.

Así que hoy voy compartir contigo dos formas que puedes usar para modificar la notificación que viene por default..

Comencemos por la básica.

Sobre Escribiendo el método SendEmailVerificationNotification

Si revisamos el código fuente vamos a ver que el modelo User utiliza el trait MustVerifyEmail que contiene los método que se usan en la verificación de correo.

Pero el método que nos interesa es el sendEmailVerificationNotification()

    /**
     * Send the email verification notification.
     *
     * @return void
     */
    public function sendEmailVerificationNotification()
    {
        $this->notify(new VerifyEmail);
    }

Este método se encarga llamar a notify, Asi que con facilidad puedes crear una nueva notificación que puede sustituir a la original.

artisan make:notification ConfirmEmail

Y con esto, solo tienes que sobre escribir el método en el modelo Models/User

<?php

class User extends Authenticatable implements MustVerifyEmail
{
    use HasFactory, Notifiable;

    //...

    /**
     * Send the email verification notification.
     *
     * @return void
     */
    public function sendEmailVerificationNotification()
    {
        $this->notify(new ConfirmEmail);
    }

    //...
}

Y eso es todo, con esto ya salvaste el día.

Usando Callbacks

Muy bien, ya que vimos la forma tradicional aprovechando la Herencia.

Ahora revisemos otra opción.

La notificación tiene algo interesante en el método toMail()

    public function toMail($notifiable)
    {
        $verificationUrl = $this->verificationUrl($notifiable);

        if (static::$toMailCallback) {
            return call_user_func(static::$toMailCallback, $notifiable, $verificationUrl);
        }

        return $this->buildMailMessage($verificationUrl);
    }

¿Observas la condición?

La propiedad $toMailCallback debe de ser una función anónima, a la cual le podemos pasar dos argumentos; a quien vamos a notificar y la url que se usara para verificar el E-mail.

Con esto en mente podemos de forma sencilla cambiar el contenido de la notificación!

Para esto podemos definir la propiedad estática $toMailCallBack en el boot de la clase App\Providers\AppServiceProvider con el nuevo contenido que queremos usar.

/**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        VerifyEmail::$toMailCallback = function($notifiable, $verificationUrl) {
            return (new MailMessage)
                ->subject(Lang::get('Verify Email Address'))
                ->greeting(Lang::get("Hello ") . $notifiable->name)
                ->line(Lang::get('Please click the button below to verify your email address.'))
                ->action(Lang::get('Verify now'), $verificationUrl)
                ->line(Lang::get('If you did not create an account, no further action is required.'))
                ->salutation(new HtmlString(
                    Lang::get("Regards.").'<br>' .'<strong>'. Lang::get("Our Team") . '</strong>'
                ));
        };
    }

Igual si prefieres usar una vista lo puedes hacer

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        VerifyEmail::$toMailCallback = function($notifiable, $verificationUrl) {
            return (new MailMessage)->view(
               'email.verification' => ['url' => $verificationUrl]
            );
        };
    }

¿Qué mas podeos personalizar?

Si revisamos el método verificationUrl() puedes apreciar que también se puede personalizar usando la propiedad $createUrlCallback con una función anónima.

Lo interesante de este método es que además puede redefinir el tiempo de vida del enlace que se genera.

    $createUrlCallback) {
            return call_user_func(static::$createUrlCallback, $notifiable);
        }

        return URL::temporarySignedRoute(
            'verification.verify',
            Carbon::now()->addMinutes(Config::get('auth.verification.expire', 60)), //<-- Aquí
            [
                'id' => $notifiable->getKey(),
                'hash' => sha1($notifiable->getEmailForVerification()),
            ]
        );
    }

Así que para cambiar el tiempo de vida solo tienes que agregar lo siguiente a archivo config/auth.php

<?php

return [
    //...
    
    'verification' => [
        'expire' => 30, //time in minutes
    ]

];

Y con esto terminamos, si tienes alguna duda deja tu comentario y con mucho gusto estaré respondiendo.