Fungsi tetapan semula kata laluan ialah komponen penting bagi mana-mana aplikasi web moden. Walaupun Laravel menyediakan penyelesaian luar biasa yang teguh, ada kalanya anda perlu menyesuaikan proses ini untuk memenuhi keperluan khusus atau meningkatkan pengalaman pengguna. Dalam tutorial ini, kami akan menyelam lebih mendalam ke dalam menyesuaikan aliran kerja tetapan semula kata laluan Laravel, merangkumi segala-galanya daripada pengubahsuaian asas kepada teknik lanjutan.
Sebelum kita mendalami penyesuaian, mari kita lakukan perjalanan pantas ke lorong ingatan untuk memahami bagaimana penyelesaian pengesahan Laravel telah berkembang:
Proses tetapan semula kata laluan Laravel biasanya melibatkan langkah berikut:
Walaupun aliran ini berfungsi dengan baik untuk kebanyakan aplikasi, anda mungkin mahu menyesuaikan pelbagai aspek proses ini agar lebih sesuai dengan keperluan anda.
Dalam tutorial ini, kami akan mencipta aplikasi Laravel SaaS (minimum) kosong dengan aliran tetapan semula kata laluan tersuai. Kami akan meliputi:
Mari kita mulakan dengan menyediakan aplikasi Laravel baharu:
composer create-project laravel/laravel password-reset-demo cd password-reset-demo
Sebelum kita meneruskan, mari kita mulakan Git untuk kawalan versi:
git init git add . git commit -m "Initial commit"
Sekarang, mari pasang Laravel Breeze untuk mendapatkan perancah pengesahan asas:
composer require laravel/breeze --dev php artisan breeze:install
Apabila digesa, pilih tindanan yang paling sesuai dengan keperluan anda. Untuk tutorial ini, kami akan menggunakan 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
Selepas pemasangan, mari lakukan perubahan kami:
git add . git commit -m "Add Authentication and Pages"
Sekarang, sediakan pangkalan data anda dan jalankan migrasi:
php artisan migrate
Pasang dan susun aset bahagian hadapan anda:
npm install npm run dev
Pada ketika ini, kami mempunyai aplikasi Laravel asas dengan fungsi pengesahan. Mari jalankan ujian untuk memastikan semuanya berfungsi seperti yang diharapkan:
php artisan test
Anda sepatutnya melihat semua ujian lulus, memberi kami lampu hijau untuk meneruskan penyesuaian kami.
Secara lalai, Laravel (menggunakan Breeze) menggunakan URL standard untuk tetapan semula kata laluan (/reset-password). Mari sesuaikan ini dalam AppServiceProvider kami:
<?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)); }); } }
Penyesuaian ini membolehkan anda mengubah suai struktur URL tetapan semula, menambah parameter tambahan atau malah menunjuk ke domain yang berbeza sama sekali jika perlu. Contohnya, anda boleh menukarnya kepada:
return "https://account.yourdomain.com/reset-password?token={$token}&email={$user->getEmailForPasswordReset()}";
Seterusnya, mari sesuaikan kandungan e-mel tetapan semula kata laluan. Kami akan melakukan ini dengan menambah pada AppServiceProvider kami:
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"); }); }
Nota: Fungsi __() ialah pembantu untuk penyetempatan, membolehkan terjemahan mudah rentetan dalam aplikasi anda.
Untuk meningkatkan pengalaman dan keselamatan pengguna, mari tambahkan pemberitahuan yang dihantar selepas penetapan semula kata laluan berjaya. Mula-mula, buat pemberitahuan baharu:
php artisan make:notification PasswordResetSuccessfullyNotification
Edit pemberitahuan yang baru dibuat:
<?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!'); } }
Sekarang, buat pendengar untuk acara PasswordReset:
php artisan make:listener SendPasswordResetSuccessfullyNotification --event=PasswordReset
Kemas kini pendengar:
<?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()); } }
Ingat untuk mendaftarkan pendengar ini dalam EventServiceProvider anda.
Ujian adalah penting untuk memastikan penyesuaian kami berfungsi seperti yang diharapkan. Kemas kini ujian tetapan semula kata laluan sedia ada dalam ujian/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!
Atas ialah kandungan terperinci Menguasai Penyesuaian Tetapan Semula Kata Laluan Laravel: Panduan Komprehensif. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!