qirolab/laravel-bannable

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

资助包维护!
其他

3.1.0 2024-03-07 16:42 UTC

This package is auto-updated.

Last update: 2024-09-07 17:35:48 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中包含ServiceProvider

'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, ]