makidizajnerica / laravel-multiemail
允许用户拥有与其账户相关的多个电子邮件地址。
Requires
- php: >=7.4
- laravel/framework: >=8.0
Requires (Dev)
- orchestra/testbench: ^6.9
- phpunit/phpunit: ^9.5
README
Laravel MultiEmail
允许用户拥有与其账户相关的多个电子邮件地址。让他们设置主电子邮件地址和恢复电子邮件地址。
安装
composer require makidizajnerica/laravel-multiemail
至于注册服务提供者,这不是必需的,Laravel 将使用包发现自动加载提供者。
配置
在 config/auth.php
中添加新的 provider
,如下所示
'providers' => [ // Laravel's default provider 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], 'emails' => [ 'driver' => 'eloquent.email', 'models' => [ 'user' => App\Models\User::class, 'email' => MakiDizajnerica\MultiEmail\Models\Email::class, ], ], ],
之后,您需要编辑现有的或创建新的 guard
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'emails', // <- edit this line ], ],
然后进入 passwords
下的内容,并按如下方式编辑
'passwords' => [ 'users' => [ 'provider' => 'emails', // <- edit this line 'table' => 'password_resets', 'expire' => 60, 'throttle' => 60, ], ],
最后一步是在 config/app.php
中将 Laravel 的默认 Illuminate\Auth\Passwords\PasswordResetServiceProvider::class
更改为如下
'providers' => [ /* * Laravel Framework Service Providers... */ Illuminate\Queue\QueueServiceProvider::class, Illuminate\Redis\RedisServiceProvider::class, Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, // <- remove this line MakiDizajnerica\MultiEmail\Providers\PasswordResetServiceProvider::class, // <- add this line Illuminate\Session\SessionServiceProvider::class, Illuminate\Translation\TranslationServiceProvider::class, ],
这部分很重要,如果您想让用户能够重置他们的密码。
发布配置
如果您的用户模型不在默认命名空间中,您需要使用以下命令发布 multiemail.php
配置文件
php artisan vendor:publish --tag=multiemail-config
然后,更改 multiemail.php
中的模型类
'user_model' => \Custom\Namespace\User::class,
迁移
首先,您需要使用以下命令发布迁移
php artisan vendor:publish --tag=multiemail-migrations
然后运行它们
php artisan migrate
运行迁移后,将创建一个新的表 emails
请务必不要忘记从 users
表中删除 email
字段!
用法
进入您的 App\Models\User::class
,并添加 MakiDizajnerica\MultiEmail\HasMultipleEmails::class
特性,并实现 MakiDizajnerica\MultiEmail\Contracts\HasMultipleEmails::class
namespace App\Models; use MakiDizajnerica\MultiEmail\HasMultipleEmails; use Illuminate\Foundation\Auth\User as Authenticatable; use MakiDizajnerica\MultiEmail\Contracts\HasMultipleEmails as HasMultipleEmailsContract; class User extends Authenticatable implements HasMultipleEmailsContract { use HasMultipleEmails; // }
然后,务必定义 emails()
关联方法
use MakiDizajnerica\MultiEmail\Models\Email; public function emails() : HasMany { return $this->hasMany(Email::class); }
之后,您的 User::class
将有一些可用方法
/** * Add new email address. * * @param array $email * @param bool $sendVerification * @return \MakiDizajnerica\MultiEmail\Email */ public function addNewEmail(array $email, $sendVerification = true); /** * Find email address. * * @param mixed $email * @param string $field * @return \MakiDizajnerica\MultiEmail\Email|null */ public function findMyEmail($email, $field = 'email'); /** * Determine if user is the owner of the provided email address. * * @param string $email * @return bool */ public function isMyEmail($email); /** * Remove all user's email addresses. * * @return void */ public function removeAllEmails(); /** * Check if the provided email address is verified. * * @param string $email * @return bool */ public function isVerifiedEmail($email); /** * Determine if provided email address is primary. * * @param string $email * @return bool */ public function isPrimaryEmail($email); /** * Change primary email address. * * @param string $email * @return void */ public function setEmailAsPrimary($email); /** * Determine if user has recovery email address. * * @return bool */ public function hasRecoveryEmail(); /** * Determine if provided email address is recovery. * * @param string $email * @return bool */ public function isRecoveryEmail($email); /** * Change recovery email address. * * @param string $email * @return void */ public function setEmailAsRecovery($email);
以及一些自定义属性
// Get all user's verified emails $user->verified_emails // Get primary email $user->email // Get recovery email if it exists $user->recovery_email
添加新的电子邮件地址
use App\Models\User; $user = User::first(); $email = $user->addNewEmail([ 'email' => 'test@mail.com' ]);
如果用户未定义主电子邮件地址,您可以这样做
use App\Models\User; use Illuminate\Support\Facades\Hash; $user = User::create([ 'name' => 'Nick', 'password' => Hash::make('password'), ]); $email = $user->addNewEmail([ 'email' => 'test@mail.com', 'type' => 'primary', ]);
每次添加新电子邮件地址时,都会发送电子邮件验证通知。如果您不想发送通知,可以将第二个参数传递给 addNewEmail()
方法,如下所示
use App\Models\User; use Illuminate\Support\Facades\Hash; $user = User::create([ 'name' => 'Nick', 'password' => Hash::make('password'), ]); $email = $user->addNewEmail([ 'email' => 'test@mail.com', 'type' => 'primary', 'verified_at' => now(), ], false);
电子邮件类型
用户可能只有一个主电子邮件地址和一个恢复电子邮件地址,因此建议使用已定义的方法来更改电子邮件地址的类型
use App\Models\User; $user = User::first(); if ($user->isMyEmail('test@mail.com')) { // Set as primary $user->setEmailAsPrimary('test@mail.com'); // Set as recovery $user->setEmailAsRecovery('test@mail.com'); }
电子邮件地址不能同时是主电子邮件地址和恢复电子邮件地址!
密码重置
默认密码重置电子邮件地址将是用户的主电子邮件地址。但如果已定义了恢复电子邮件地址,用户也可以使用该电子邮件地址。Laravel 的默认密码重置服务仍然可以正常使用,有关密码重置的更多信息,请访问 https://laravel.net.cn/docs/8.x/passwords。
在 multiemail.php
配置文件中,您将能够启用/禁用密码重置,并指定是否应使用主电子邮件地址进行重置。
'passwords' => [ 'allow_resets' => true, 'reset_with_primary_email' => true, ],
作者
Nemanja Marijanovic (n.marijanovic@hotmail.com)
许可证
版权 © 2021,Nemanja Marijanovic n.marijanovic@hotmail.com
版权所有。
有关完整的版权和许可信息,请参阅本包源根目录中的 LICENSE 文件。