zinethq/spark-invite

此包已被废弃且不再维护。作者建议使用 centrality-labs/spark-invite 包。

Laravel Spark 用户邀请系统

v1.0.0 2017-08-31 15:48 UTC

This package is not auto-updated.

Last update: 2022-02-01 13:04:12 UTC


README

Spark Invite 是用于用户账号可以预先填充的场景,例如通过第三方提供的信息,需要发送邀请以便潜在用户“认领”他们的账号。

例如,在一个系统中可能需要批量创建新的用户账号以确保安全性、一致性和便利性。一旦创建了一个新的用户账号,SparkInvite 包可以用来管理账号认领的过程。这些阶段包括

  • 一个推荐者(可能属于多个团队中的一个)邀请新的用户账号。这被封装在 Invitation 模型中。
  • 触发一个 invite 事件,允许 SparkInvite 包之外的代码在发出任何通信之前验证邀请。例如,自动检查电子邮件地址域名或手动验证可能需要电话通信的邀请。
  • 触发一个 issued 事件,允许发出接受/拒绝链接。邀请的实际发送是在 SparkInvites 包之外完成的,允许您的系统使用您首选的包/通信方式。
  • 如果用户接受邀请,用户将立即被要求使用 Spark 的标准密码重置机制重置他们的密码。用户也可以拒绝邀请。
  • 邀请可以过期,可以是软过期(允许恢复邀请,除非手动清理已过期的邀请)或硬过期(一旦邀请过期,就不能再使用)。

安装

  1. 在包中要求

    composer require zinethq/spark-invite dev-master
  2. 编辑 config\app.php 以包含

    ...
    'providers' => [
        ...
        ZiNETHQ\SparkInvite\SparkInviteServiceProvider::class,
        ...
    ],
    ...
    'aliases' => [
        ...
        'SparkInvite' => ZiNETHQ\SparkInvite\Facades\SparkInvite::class,
        ...
    ],
    ...
  3. 运行以下命令

    php artisan vendor:publish --provider="ZiNETHQ\SparkInvite\SparkInviteServiceProvider"

    这将发布以下文件

    • /database/migrations/TIMESTAMP_create_user_invitations_table.php
    • /database/migrations/TIMESTAMP_create_invitation_status_table.php
    • /config/sparkinvite.php
    • /app/Listeners/InvitationListener.php
    • /app/InvitationStatus.php
  4. 迁移数据库

  5. 将以下内容添加到您的 App\Providers\EventServiceProvider 类中

    protected $listen = [
        ...
        'spark.invite.*' => [
            'App\Listeners\InvitationListener',
        ],
        ...
    ];

错误管理

当令牌存在问题,例如不存在或已被撤销时,邀请控制器将重定向回配置设置 sparkinvites.routes.on-error 中定义的路由。当重定向用户时,将通过配置的变量名传递 sparkinvites.messages 之一到 sparkinvite.flash,这可以在您的视图中显示。例如,使用 Vue.js 和 Notify.js(以及 underscore.string/lodash 用于大写化和 sprintf 用于字符串创建)的以下组件将这样做

Vue.component('alert', {

    props: {
        message: {
            type: Object,
            required: false,
            default: null
        }
    },

    computed: {
        title: function () {
            return sprintf('<strong>%s</strong>', _string.capitalize(this.message.type));
        },

        type: function () {
            switch (this.message.type) {
                case 'error':
                    return 'danger';
                case 'warning':
                    return 'warning';
                case 'success':
                    return 'success';
                case 'info':
                    return 'info';
                default:
                    return 'danger';
            }
        },

        icon: function() {
            switch (this.type) {
                case 'danger':
                    return 'fa fa-times-circle';
                case 'warning':
                    return 'fa fa-exclamation-triangle';
                case 'success':
                    return 'fa fa-check-circle';
                case 'info':
                    return 'fa fa-info-circle';
                default:
                    return 'fa fa-times-circle';
            }
        }
    },

    template: '',

    created: function () {
        this.$nextTick(function () {
            if (this.message) {
                $.notify({
                    icon: this.icon,
                    title: this.title,
                    message: this.message.content
                },{
                    type: this.type,
                    timer: 3000,
                });
            }
        });
    }

});

在您的视图页面上如此使用时

<alert :message="{{ json_encode(session()->get('alert'), null) }}"></alert>