think.studio / laravel-email-change-verification
该包允许在用户更改邮箱时为新的邮箱地址添加验证
1.2.0
2023-08-26 08:14 UTC
Requires
- php: ^8.0
- illuminate/support: ^9.0|^10.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.20
- orchestra/testbench: ^8.6
- phpunit/phpunit: ^10.3
- psalm/plugin-laravel: ^2.8
- vimeo/psalm: ^5.14
README
该包允许在用户更改邮箱时为新的邮箱地址添加验证
安装
您可以通过Composer安装此包
composer require think.studio/laravel-email-change-verification php artisan vendor:publish --provider="EmailChangeVerification\ServiceProvider" --tag="config"
配置和用法
- 创建迁移。该包不提供默认迁移,因此您需要手动创建表。但该包提供了具有默认列的类。
public function up() { Schema::create('email_changes', function (\Illuminate\Database\Schema\Blueprint $table) { \EmailChangeVerification\Database\MigrationHelper::defaultColumns($table); }); } public function down() { Schema::dropIfExists('email_changes'); }
php artisan migrate
- 更新用户模型
use EmailChangeVerification\User\HasEmailChangeVerification; use EmailChangeVerification\User\WithEmailChangeVerification; class User extends Authenticatable implements HasEmailChangeVerification { use WithEmailChangeVerification; // ... }
- 在邮箱变更时发送验证邮件
if ($user->email != $request->input('email')) { $status = EmailChange::sendVerificationLink([ 'email' => $user->email, ], $request->input('email')); if ($status == EmailChange::VERIFICATION_LINK_SENT) { $successMessage = __($status); } else { throw ValidationException::withMessages([ 'email' => __($status), ]); } }
- 验证新的邮箱
// routes Route::get( '/email-change-verification/{token}', [ \App\Http\Controllers\Dashboard\ProfileController::class, 'verifyNewEmail', ] )->name('email.change.verification');
// controller public function verifyNewEmail( Request $request, string $token ) { $validator = Validator::make( array_merge($request->all(), [ 'token' => $token, ]), [ 'email' => [ 'required', 'email' ], 'new_email' => [ 'required', 'email' ], 'token' => [ 'required', 'string', 'max:64' ], ] ); if($validator->fails()) { abort(404); } $status = EmailChange::verify( [ 'email' => $request->input( 'email', '' ), 'new_email' => $request->input( 'new_email', '' ), 'token' => $token, ], function ( $user, string $newEmail ) { // user manipulation $user->email = $newEmail; $user->save(); } ); if ( $status != EmailChange::EMAIL_CHANGED ) { return __( $status ); // return view or redirect } return 'Success'; // return view or redirect }
- 检查是否已发送请求
// returns email or null if expired, Example: test@test.com $lastRequestedEmailChange = EmailChange::getRepository()->lastRequestedEmail($user);