alexwinder/laravel-confirm-new-email

这是一个 Laravel 5 包,允许用户在更新邮箱地址时验证邮箱地址。

v0.0.2 2019-07-08 19:49 UTC

This package is auto-updated.

Last update: 2024-09-04 21:16:13 UTC


README

这是一个 Laravel 包,当用户想要更新他们的电子邮件地址时,他们必须首先验证新电子邮件地址才能成功更新。如果您想确保用户在更改账户信息时控制他们的电子邮件地址,这特别有用。

通过向新用户的电子邮件地址发送通知邮件来完成此操作,当用户点击邮件中的链接时,他们的电子邮件地址将在系统中更新。当用户的电子邮件地址更新成功后,还会向新旧电子邮件地址发送第二封通知邮件,通知用户账户更改。

安装

在 Composer 中要求

将此包要求到您的 composer.json 文件中。

composer require alexwinder/laravel-confirm-new-email

注册服务提供者

在您的 Laravel 应用的 config/app.php 文件中的 providers 数组中注册 ConfirmNewEmailServiceProvider

'providers' => [
    ...
    AlexWinder\ConfirmNewEmail\ConfirmNewEmailServiceProvider::class,
    ...
],

确认用户模型

在您的 config/auth.php 文件中,确保您已正确指定您的用户模型和表,在 providers 数组中。

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => Namespace\Of\Your\User\Model\User::class,
        'table' => 'users'
    ],
],

电子邮件属性批量赋值

如果您正在保护 Laravel 项目中的批量赋值,则必须确保您的用户模型具有与电子邮件地址相关的属性添加到其 $fillable 数组中,默认情况下所有 Eloquent 模型都保护批量赋值。如果您不将此值添加到 $fillable 数组中,您将收到一个批量赋值异常。例如

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Authenticatable
{
    /**
    * The attributes that are mass assignable.
    *
    * @var array
    */
    protected $fillable = [
        'name', 'email', 'password',
    ];
}

如果您还希望在更新时验证电子邮件地址,则也应 将此字段添加到 您的 $fillable 数组中。

发布供应商文件

如果您愿意,可以使用 config 标签发布配置文件。这将在您的配置路径中创建一个 confirm-new-email 配置文件,允许您根据您的 Laravel 项目自定义此包。如果您不发布此文件,则将使用 src/config/config.php 中设置的默认值,但这可能在使用此包与您的项目时导致一些意想不到的问题。

php artisan vendor:publish --provider="AlexWinder\ConfirmNewEmail\ConfirmNewEmailServiceProvider" --tag="config"

此包附带了一些用于表单和电子邮件 markdown 的视图。如果您希望根据您的 Laravel 项目自定义这些视图,可以使用 views 标签进行发布。这些文件将发布到您的项目资源路径中的 views/vendor/confirm-new-email 目录。

php artisan vendor:publish --provider="AlexWinder\ConfirmNewEmail\ConfirmNewEmailServiceProvider" --tag="views"

准备您的 Laravel 项目

如果您选择使用此包,有一些需要注意的事项,您可能需要修改您的 Laravel 项目。

  1. 位于 src/views 中的视图使用了一些默认的 Laravel 配置设置。如果您选择不发布到您的项目或为您的用例进行配置而使用这些视图,则应在您的项目中检查以下内容

    • config('app.name')
    • config('app.url')
  2. 您的项目应正确配置电子邮件服务器设置,以便通过电子邮件发送电子邮件验证通知给用户。有关如何为您的项目配置特定用例,请参考Laravel 文档

  3. 您的 Eloquent User 模型应包含一个与用户电子邮件地址相关的 email 属性。如果您使用的是 Laravel 默认提供的 User 模型/迁移,那么您不太可能需要更改它。然而,如果您已经更改了默认值,那么在 User 模型中为 email 属性定义访问器是最简单的方法。

    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class User extends Model
    {
        /**
        * Get the user's e-mail address.
        *
        * @return string
        */
        public function getEmailAttribute()
        {
            return $this->your_current_email_address_attribute;
        }
    }

用法

路由

src/routes.php 文件中,已定义了一些路由,用于显示更新表单和处理电子邮件地址更新。

如果您选择使用本包中包含的默认视图,您可以通过以下方式在视图中链接到更新表单:

  • route(config('confirm-new-email.route.edit.name')) 是一个 GET 请求,将显示用户请求更新电子邮件地址所使用的表单。
  • route(config('confirm-new-email.route.update-request.name')) 是一个 POST 请求,它接受一个新的用户电子邮件地址的 new_email 值。然后,使用此值向新电子邮件地址发送电子邮件通知,以确认对用户账户的更新。
  • route(config('confirm-new-email.route.update-confirm.name')) 是一个 GET 请求,在点击确认链接后处理用户电子邮件地址的更新。

如果您愿意,可以选择不使用 route(config('confirm-new-email.route.edit.name')) 并创建自己的表单。但是,为了使用此包,您必须在 POST 请求中提交到 route(config('confirm-new-email.route.update-request.name'))route(config('confirm-new-email.route.update-request.uri')),并且必须向此路由发送一个 new_email 值。例如:

<form method="POST" action="{{ route(config('confirm-new-email.route.update-request.name')) }}">
    @csrf

    <div class="form-group row">
        <label for="new_email" class="col-md-4 col-form-label text-md-right">New E-Mail Address</label>

        <div class="col-md-6">
            <input id="new_email" type="email" class="form-control" name="new_email" value="{{ old('new_email') }}" required autocomplete="email" autofocus>
        </div>
    </div>

    <div class="form-group row mb-0">
        <div class="col-md-8 offset-md-4">
            <button type="submit" class="btn btn-primary">
                Submit
            </button>
        </div>
    </div>
</form>

配置设置

虽然已在配置文件中尽力提供详细信息,但有关配置值的更多信息可以在下面找到。

电子邮件验证

email-verify 是一个布尔值,当设置为 true 时,也会更新用户的已验证时间。

请注意,此值将更新为当前的日期时间戳,这与 Laravel 中的方法相同。因此,如果您更改了 Laravel 验证用户的方式,那么您应该将此值设置为 false

如果您将此值设置为 true,您必须执行以下操作:

  • 您必须确保在项目中存储用户已验证字段日期时间的字段已正确设置在配置中。这配置在 config('confirm-new-email.user.fields.verified-datetime') 值中。

  • 如果您在 Laravel 项目中保护免受批量赋值,那么您必须确保您的 User 模型已将用户已验证字段添加到其 $fillable 数组中。默认情况下,所有 Eloquent 模型都保护免受批量赋值。如果您不将此值添加到 $fillable 数组中,您将收到一个批量赋值异常。例如:

    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class User extends Authenticatable
    {
        /**
        * The attributes that are mass assignable.
        *
        * @var array
        */
        protected $fillable = [
            'name', 'email', 'password', 'email_verified_at',
        ];
    }

重定向

redirect 是一个值数组,用于指定在处理过程中用于重定向用户的命名路由。

请注意,这些是命名路由,因此命名路由必须在您的 Laravel 项目中存在。

  • config('confirm-new-email.redirect.update-confirm') 是在成功验证用户的新电子邮件地址后,用户将被重定向到的位置的命名路由。默认情况下,这被设置为重定向回 src/view/email-edit.blade.php。有关更多信息,请参阅路由/URI 名称部分

路由 URI/名称

route 是一个值数组,用于在 src/routes.php 文件中定义路由名称和 URI。如果您希望为您的 Laravel 项目自定义此包的路由名称/URI,则应编辑这些配置值。

如果您正在使用默认 Laravel 项目,那么您可能不需要更改这些值,除非当然您不喜欢命名约定。如果您已经在 Laravel 项目中存在冲突的路由名称/URI,那么这些默认值应该被更改。

所有路由的 name 值应彼此唯一。

需要注意的是,如果您更改了 config('confirm-new-email.route.edit.name') 的默认值,那么您可能还需要更新 config('confirm-new-email.redirect.update-confirm') 以匹配在 重定向部分 中列出的新路由名称。

更新过期

update-expiry 是一个值数组,用于设置电子邮件地址确认的过期限制。当这些值被正确设置时,用户将有一段时间来确认他们的新电子邮件地址。

  • config('confirm-new-email.update-expiry.enabled') 是一个布尔值,如果您希望启用此功能,则应将其设置为 true
  • config('confirm-new-email.update-expiry.limit') 是一个整数,表示用户确认新电子邮件地址的时间(分钟数)。如果此值设置为 0,则与将 config('confirm-new-email.update-expiry.enabled') 设置为 false 的效果相同。

用户设置

user 是一个值数组,与您的 Laravel 项目的 User 模型相关。

  • config('confirm-new-email.user.email') 是您的 User 模型的电子邮件地址字段。
  • config('confirm-new-email.user.verified-datetime') 是用户电子邮件地址被验证的 datetime 字段。请注意,此字段必须作为 $fillable 数组的一部分存在于您的 User 模型中,并且您必须正确设置 config('confirm-new-email.email-verify') 值。有关更多详细信息,请参阅 电子邮件验证部分

电子邮件通知

当带有 new_email 值的 POST 请求发送到 config('confirm-new-email.route.update-request.name') 时,会发生以下情况

  • 验证新电子邮件地址以确保它已被发送,并且尚未在数据库中持久化。
  • 然后向用户的新的电子邮件地址发送电子邮件通知,其中包含必须访问以确认用户账户更改的 URL。

此 URL 将是签名的 URL,指向 config('confirm-new-email.route.update-confirm.name')。这是一个 GET 请求,执行以下操作

  • 进行多项检查以确保签名的 URL 有效,用户的电子邮件地址在请求更新和更新电子邮件地址之间没有更改,或者他们的新电子邮件地址在这段时间内已被使用。
  • 更新用户的电子邮件地址。
  • 向用户账户的新旧电子邮件地址发送电子邮件通知,告知电子邮件地址已在该账户上更新。

对于这两个路由,Laravel 的 auth 中间件都处于就绪状态 - 因为用户必须完全认证才能完成电子邮件地址的更新。

发送的电子邮件通知使用 Markdown。如果您想编辑这些电子邮件的内容,应该 发布视图 - 这将在您项目的资源路径中的 views/vendor/confirm-new-email 目录下发布,您可以在那里编辑它们以满足您的特定需求。

待办事项

  • 测试。

变更日志

本项目变更日志可在此处找到:CHANGELOG.md

许可证

本项目采用 MIT 许可证授权。