hkp22/laravel-bannable

此包已弃用且不再维护。作者建议使用 qirolab/laravel-bannable 包。

Laravel bannable 包用于阻止和禁止 Eloquent 模型。

资助包维护!
其他

2.4.0 2020-09-09 14:55 UTC

This package is auto-updated.

Last update: 2022-02-01 13:14:00 UTC


README

Latest Version on Packagist GitHub Tests Action Status Styling Psalm GitHub

Laravel bannable 包用于阻止和禁止 Eloquent 模型。使用此包,任何模型都可以被设置为可禁止,例如组织、团队、组等。

安装

使用 Composer 将包下载到项目中。

composer require qirolab/laravel-bannable

注册包

Laravel 5.5(或更高版本)使用包自动发现,因此不需要您手动添加 ServiceProvider。

对于 Laravel 5.4 或更早版本,请在 app/config/app.php 中包含服务提供者。

'providers' => [
    Qirolab\Laravel\Bannable\BannableServiceProvider::class,
],

准备迁移

现在需要向模型添加可空的 banned_at 时间戳列。因此,创建一个新的迁移文件。

php artisan make:migration add_banned_at_column_to_users_table

在新迁移文件中添加 $table->timestamp('banned_at')->nullable();,如下面的示例所示。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class AddBannedAtColumnToUsersTable extends Migration
{
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->timestamp('banned_at')->nullable();
        });
    }

    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('banned_at');
        });
    }
}

现在运行迁移。

php artisan migrate

准备可禁止模型

如以下示例所示,在模型中使用 Bannable 特性。

use Qirolab\Laravel\Bannable\Traits\Bannable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Bannable;
}

可用方法

禁止模型实体

$user->ban();

带有原因注释的禁止模型实体

$user->ban([
    'comment' => 'ban comment!',
]);

带有过期时间的禁止模型实体

这里的 expired_at 属性可以是 \Carbon\Carbon 实例或任何可以被 \Carbon\Carbon::parse($string) 方法解析的时间字符串。

$user->ban([
    'expired_at' => '2086-03-28 00:00:00',
]);

或者

$user->ban([
    'expired_at' => '+1 year',
]);

或者

$date = Carbon::now()->addWeeks(2);

$user->ban([
    'expired_at' => $date,
]);

移除禁止模型

unban 时,所有相关禁止模型都将被软删除。

$user->unban();

检查实体是否被禁止

$user->isBanned();

检查实体是否没有被禁止

$user->isNotBanned();

手动删除过期的禁止

Qirolab\Laravel\Bannable\Models\Ban::deleteExpired();

作用域

获取所有未禁止的模型

$users = User::withoutBanned()->get();

获取禁止和未禁止的模型

$users = User::withBanned()->get();

获取仅被禁止的模型

$users = User::onlyBanned()->get();

禁用默认隐藏被禁用模型实体的范围

默认情况下,所有被禁用的模型都将被隐藏。要始终禁用查询范围,你可以在可禁用模型中定义 disableBannedAtScope 方法。

/**
 * Determine which BannedAtScope should be applied or not.
 *
 * @return bool
 */
public function disableBannedAtScope()
{
    return true;
}

事件

在模型实体被禁用时会触发 \Qirolab\Laravel\Bannable\Events\ModelWasBanned 事件。

在模型实体被解禁时会触发 \Qirolab\Laravel\Bannable\Events\ModelWasUnbanned 事件。

中间件

为了防止被禁用用户访问受保护的路由,创建了 Qirolab\Laravel\Bannable\Middleware\ForbidBannedUser 中间件。

在 app/Http/Kernel.php 文件的 $routeMiddleware 数组中注册它

protected $routeMiddleware = [ 'isBannedUser' => \Qirolab\Laravel\Bannable\Middleware\ForbidBannedUser::class, ]