Maison >développement back-end >tutoriel php >Maîtriser la personnalisation de la réinitialisation du mot de passe Laravel : un guide complet
La fonctionnalité de réinitialisation du mot de passe est un composant essentiel de toute application Web moderne. Bien que Laravel fournisse une solution robuste et prête à l'emploi, vous devez parfois adapter ce processus pour répondre à des exigences spécifiques ou améliorer l'expérience utilisateur. Dans ce didacticiel, nous approfondirons la personnalisation du flux de travail de réinitialisation de mot de passe de Laravel, couvrant tout, des modifications de base aux techniques avancées.
Avant de nous plonger dans la personnalisation, faisons un petit voyage dans le passé pour comprendre comment les solutions d'authentification de Laravel ont évolué :
Le processus de réinitialisation du mot de passe de Laravel implique généralement les étapes suivantes :
Bien que ce flux fonctionne bien pour la plupart des applications, vous souhaiterez peut-être personnaliser divers aspects de ce processus pour mieux répondre à vos besoins.
Dans ce didacticiel, nous allons créer une application Laravel SaaS (minimale) nue avec un flux de réinitialisation de mot de passe personnalisé. Nous couvrirons :
Commençons par configurer une nouvelle application Laravel :
composer create-project laravel/laravel password-reset-demo cd password-reset-demo
Avant de continuer, initialisons Git pour le contrôle de version :
git init git add . git commit -m "Initial commit"
Maintenant, installons Laravel Breeze pour obtenir l'échafaudage d'authentification de base :
composer require laravel/breeze --dev php artisan breeze:install
Lorsque vous y êtes invité, choisissez la pile qui correspond le mieux à vos besoins. Pour ce tutoriel, nous utiliserons Livewire :
php artisan breeze:install Which Breeze stack would you like to install? ❯ livewire Would you like dark mode support? (yes/no) [no] ❯ no Which testing framework do you prefer? [PHPUnit] ❯ Pest
Après l'installation, validons nos modifications :
git add . git commit -m "Add Authentication and Pages"
Maintenant, configurez votre base de données et exécutez les migrations :
php artisan migrate
Installez et compilez vos ressources frontend :
npm install npm run dev
À ce stade, nous disposons d'une application Laravel de base avec une fonctionnalité d'authentification. Exécutons les tests pour nous assurer que tout fonctionne comme prévu :
php artisan test
Vous devriez voir tous les tests réussir, nous donnant le feu vert pour procéder à nos personnalisations.
Par défaut, Laravel (utilisant Breeze) utilise une URL standard pour la réinitialisation du mot de passe (/reset-password). Personnalisons cela dans notre AppServiceProvider :
<?php namespace App\Providers; use App\Models\User; use Illuminate\Auth\Notifications\ResetPassword; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { public function boot(): void { ResetPassword::createUrlUsing(function (User $user, string $token) { return url(route('password.reset', [ 'token' => $token, 'email' => $user->getEmailForPasswordReset(), ], false)); }); } }
Cette personnalisation vous permet de modifier la structure de l'URL de réinitialisation, d'ajouter des paramètres supplémentaires, ou même de pointer vers un domaine complètement différent si nécessaire. Par exemple, vous pouvez le remplacer par :
return "https://account.yourdomain.com/reset-password?token={$token}&email={$user->getEmailForPasswordReset()}";
Ensuite, personnalisons le contenu de l'e-mail de réinitialisation du mot de passe. Nous ferons cela en ajoutant à notre AppServiceProvider :
use Illuminate\Notifications\Messages\MailMessage; // ... public function boot(): void { // ... previous customizations ResetPassword::toMailUsing(function (User $user, string $token) { $url = url(route('password.reset', [ 'token' => $token, 'email' => $user->getEmailForPasswordReset(), ], false)); return (new MailMessage) ->subject(config('app.name') . ': ' . __('Reset Password Request')) ->greeting(__('Hello!')) ->line(__('You are receiving this email because we received a password reset request for your account.')) ->action(__('Reset Password'), $url) ->line(__('This password reset link will expire in :count minutes.', ['count' => config('auth.passwords.' . config('auth.defaults.passwords') . '.expire')])) ->line(__('If you did not request a password reset, no further action is required.')) ->salutation(__('Regards,') . "\n" . config('app.name') . " Team"); }); }
Remarque : La fonction __() est une aide à la localisation, permettant une traduction facile des chaînes dans votre application.
Pour améliorer l'expérience utilisateur et la sécurité, ajoutons une notification envoyée après une réinitialisation réussie du mot de passe. Tout d'abord, créez une nouvelle notification :
php artisan make:notification PasswordResetSuccessfullyNotification
Modifiez la notification nouvellement créée :
<?php namespace App\Notifications; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Notification; class PasswordResetSuccessfullyNotification extends Notification implements ShouldQueue { use Queueable; public function via($notifiable) { return ['mail']; } public function toMail($notifiable) { return (new MailMessage) ->subject('Password Reset Successful') ->greeting('Hello!') ->line('Your password has been successfully reset.') ->line('If you did not reset your password, please contact support immediately.') ->action('Login to Your Account', url('/login')) ->line('Thank you for using our application!'); } }
Maintenant, créez un écouteur pour l'événement PasswordReset :
php artisan make:listener SendPasswordResetSuccessfullyNotification --event=PasswordReset
Mettre à jour l'auditeur :
<?php namespace App\Listeners; use App\Notifications\PasswordResetSuccessfullyNotification; use Illuminate\Auth\Events\PasswordReset; use Illuminate\Contracts\Queue\ShouldQueue; class SendPasswordResetSuccessfullyNotification implements ShouldQueue { public function handle(PasswordReset $event) { $event->user->notify(new PasswordResetSuccessfullyNotification()); } }
N'oubliez pas d'enregistrer cet auditeur dans votre EventServiceProvider.
Les tests sont cruciaux pour garantir que nos personnalisations fonctionnent comme prévu. Mettez à jour le test de réinitialisation de mot de passe existant dans tests/Feature/Auth/PasswordResetTest.php :
<?php namespace Tests\Feature\Auth; use App\Models\User; use App\Notifications\PasswordResetSuccessfullyNotification; use Illuminate\Auth\Notifications\ResetPassword; use Illuminate\Support\Facades\Notification; use Tests\TestCase; class PasswordResetTest extends TestCase { public function test_reset_password_link_can_be_requested(): void { Notification::fake(); $user = User::factory()->create(); $this->post('/forgot-password', ['email' => $user->email]); Notification::assertSentTo($user, ResetPassword::class, function ($notification) use ($user) { $response = $this->get($notification->toMail($user)->actionUrl); $this->assertStringContainsString('Reset Password', $response->getContent()); return true; }); } public function test_password_can_be_reset_with_valid_token(): void { Notification::fake(); $user = User::factory()->create(); $this->post('/forgot-password', ['email' => $user->email]); Notification::assertSentTo($user, ResetPassword::class, function ($notification) use ($user) { $token = $notification->token; $response = $this->post('/reset-password', [ 'token' => $token, 'email' => $user->email, 'password' => 'new-password', 'password_confirmation' => 'new-password', ]); $response->assertSessionHasNoErrors(); Notification::assertSentTo($user, PasswordResetSuccessfullyNotification::class); return true; }); } public function test_reset_password_email_contains_custom_content(): void { Notification::fake(); $user = User::factory()->create(); $this->post('/forgot-password', ['email' => $user->email]); Notification::assertSentTo($user, ResetPassword::class, function ($notification) use ($user) { $mailMessage = $notification->toMail($user); $this->assertStringContainsString('Hello!', $mailMessage->greeting); $this->assertStringContainsString('Regards,', $mailMessage->salutation); return true; }); } }
Customizing Laravel's password reset workflow allows you to create a more tailored and user-friendly experience for your application. We've covered how to modify the reset URL, customize the email content, add a success notification, and ensure everything works through automated testing.
Remember, while customization can be powerful, it's essential to maintain security best practices throughout the process. Always validate user input, use secure token generation and storage methods, and follow Laravel's security recommendations.
Some additional considerations for further improvements:
For more advanced topics and Laravel insights, check out the official Laravel documentation and stay tuned to the Laravel community resources for more in-depth tutorials and best practices.
Happy coding, and may your Laravel applications be ever secure and user-friendly!
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!