makidizajnerica/laravel-multiemail

允许用户拥有与其账户相关的多个电子邮件地址。

v1.0.0 2021-11-12 22:41 UTC

This package is auto-updated.

Last update: 2024-09-13 05:27:51 UTC


README

Laravel MultiEmail Logo

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 文件。