Laravel incluye de serie la funcionalidad para el restablecimiento de contraseña. Si ya tienes todo configurado y lo único que quieres es cambiar el texto del email que se envía por defecto tienes dos opciones:
- Dejar el email tal cual y solo cambiar el idioma mediante un archivo de traducciones.
- Crear una nueva notificación personalizada para reemplazar la estructura existente del mensaje por defecto.
Para realizar la segunda opción vamos a necesitar crear una nueva notificación de Laravel usando el siguiente comando:
php artisan make:notification ResetPassword
Este comando crea un nuevo archivo de notificación que se guarda en la carpeta app/Notifications. Una vez creada la nueva notificación podemos personalizar el email que se envía mediante la función toMail.
Para ahorrarnos algo de trabajo podemos reutilizar la notificación por default ResetPassword y tambien la clase MailMessage de Laravel y tan solo cambiar el orden y el idioma de los párrafos, de tal forma que un email de restablecimiento de contraseña quede así:
<?php namespace App\Notifications; use \Illuminate\Auth\Notifications\ResetPassword as ResetPasswordNotification; use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Support\Facades\Lang; class ResetPassword extends ResetPasswordNotification { /** * Build the mail representation of the notification. * * @param mixed $notifiable * @return \Illuminate\Notifications\Messages\MailMessage */ public function toMail($notifiable) { return (new MailMessage) ->subject(Lang::get('Solicitud de restablecimiento de contraseña')) ->line(Lang::get('Hola, se solicitó un restablecimiento de contraseña para tu cuenta ' . $notifiable->getEmailForPasswordReset() . ', haz clic en el botón que aparece a continuación para cambiar tu contraseña.')) ->action(Lang::get('Cambiar contraseña'), url(config('app.url') . route('password.reset', ['token' => $this->token, 'email' => $notifiable->getEmailForPasswordReset()], false))) ->line(Lang::get('Si tu no realizaste la solicitud de cambio de contraseña, solo ignora este mensaje. ')) ->line(Lang::get('Este enlace solo es válido dentro de los proximos :count minutos.', ['count' => config('auth.passwords.' . config('auth.defaults.passwords') . '.expire')])); } }
Por último tan solo tenemos que decirle a Laravel que queremos usar nuestra nueva notificación en lugar de la notificación por defecto, para ello debemos editar el modelo de Usuario y sobreescribir el método sendPasswordResetNotification.
use App\Notifications\ResetPassword; .... /** * Send the password reset notification. * * @param string $token * @return void */ public function sendPasswordResetNotification($token) { $this->notify(new ResetPassword($token)); }
Al final obtendremos un email con el siguiente aspecto: