Laravel Ban简化了Eloquent模型禁用和封禁的过程。

1.0 2023-09-21 09:25 UTC

This package is auto-updated.

Last update: 2024-09-21 12:06:59 UTC


README

cog-laravel-ban

Discord Releases Build Status StyleCI Code Quality License

介绍

Laravel Ban简化了Eloquent模型禁用的管理。几分钟内使任何模型可被禁用!

用例不仅限于User模型,任何Eloquent模型都可以被禁用:组织、团队、组和其他。

内容

功能

  • 模型可以有多个禁用。
  • 被移除的禁用记录作为软删除记录保留在历史中。
  • 大部分逻辑由BanService处理。
  • 具有中间件以防止被禁用用户的路由访问。
  • 用例不仅限于User模型,任何Eloquent模型都可以被禁用。
  • 在模型上触发banunban事件。
  • 设计为与Laravel Eloquent模型一起工作。
  • 具有Laravel Nova支持
  • 使用合约以保持高度定制能力。
  • 使用特性以获得开箱即用的功能。
  • 遵循PHP标准建议
  • 覆盖单元测试。

安装

首先,通过Composer引入包

composer require cybercog/laravel-ban

注册包

该包将自动注册自身。此步骤仅适用于Laravel 5.4或更早版本。

app/config/app.php中包含服务提供者

'providers' => [
    Cog\Laravel\Ban\Providers\BanServiceProvider::class,
],

应用数据库迁移

最后,您需要发布并运行数据库迁移

php artisan vendor:publish --provider="Cog\Laravel\Ban\Providers\BanServiceProvider" --tag="migrations"
php artisan migrate

使用

准备可禁用模型

use Cog\Contracts\Ban\Bannable as BannableInterface;
use Cog\Laravel\Ban\Traits\Bannable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements BannableInterface
{
    use Bannable;
}

准备可禁用模型数据库表

可禁用模型必须有一个名为banned_atnullable timestamp列。此值用作标志,简化了检查用户是否被禁用的过程。如果您正在尝试使默认的Laravel User模型可被禁用,可以使用以下示例。

创建一个新的迁移文件

php artisan make:migration add_banned_at_column_to_users_table

然后,将以下代码插入到迁移文件中

<?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');
        });
    }
}

可用方法

对实体应用禁用

$user->ban();

对实体应用带评论的禁用

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

对将被删除的实体应用禁用

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

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

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

从实体中移除禁用

$user->unban();

unban时,所有相关的禁用模型都会被软删除。

检查实体是否被禁用

$user->isBanned();

检查实体是否未被禁用

$user->isNotBanned();

手动删除过期的禁用

app(\Cog\Contracts\Ban\BanService::class)->deleteExpiredBans();

确定禁用是否为永久性

$ban = $user->ban();

$ban->isPermanent(); // true

或者传递null值。

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

$ban->isPermanent(); // true

确定禁用是否为临时性

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

$ban->isTemporary(); // true

范围

获取所有未被禁用的模型

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

获取被禁用和未被禁用的模型

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

获取仅被禁用的模型

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

范围自动应用

要始终应用查询范围,您可以在可禁用模型中定义shouldApplyBannedAtScope方法。如果方法返回true,则默认情况下将隐藏所有被禁用的模型。

use Cog\Contracts\Ban\Bannable as BannableInterface;
use Cog\Laravel\Ban\Traits\Bannable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements BannableInterface
{
    use Bannable;
    
    /**
     * Determine if BannedAtScope should be applied by default.
     *
     * @return bool
     */
    public function shouldApplyBannedAtScope()
    {
        return true;
    }
}

事件

如果实体被禁用,将触发\Cog\Laravel\Ban\Events\ModelWasBanned事件。

如果实体被解除禁用,将触发\Cog\Laravel\Ban\Events\ModelWasUnbanned事件。

中间件

本软件包包含路由中间件,旨在防止被禁止的用户访问受保护的路由。

要使用它,请在 app/Http/Kernel.php 文件中的 $routeMiddleware 数组中定义新的中间件。

protected $routeMiddleware = [
    'forbid-banned-user' => \Cog\Laravel\Ban\Http\Middleware\ForbidBannedUser::class,
]

然后在您需要保护的任何路由和路由组中使用它。

Route::get('/', [
    'uses' => 'UsersController@profile',
    'middleware' => 'forbid-banned-user',
]);

如果您希望在受保护的路由访问时强制注销被禁止的用户,请使用 LogsOutBannedUser 中间件。

protected $routeMiddleware = [
    'logs-out-banned-user' => \Cog\Laravel\Ban\Http\Middleware\LogsOutBannedUser::class,
]

调度

在完成基本安装后,您可以开始使用 ban:delete-expired 命令。在大多数情况下,您会希望安排这些命令,这样您就不必每次需要删除过期禁令和解除禁令模型时都手动运行它。

可以在 Laravel 的控制台内核中安排此命令,就像安排其他命令一样。

// app/Console/Kernel.php

protected function schedule(Schedule $schedule)
{
    $schedule->command('ban:delete-expired')->everyMinute();
}

当然,上面代码中使用的只是示例时间。请根据您的偏好进行调整。

集成

变更日志

有关最近更改的更多信息,请参阅 CHANGELOG

升级

有关详细的升级说明,请参阅 UPGRADING

贡献

有关详细信息,请参阅 CONTRIBUTING

测试

使用以下命令运行测试:

vendor/bin/phpunit

安全

如果您发现任何安全相关的问题,请通过电子邮件 open@cybercog.su 报告,而不是使用问题跟踪器。

贡献者

Laravel Ban 贡献者列表

替代方案

许可证

🌟 随时间变化的星标数量

Stargazers over time

关于CyberCog

CyberCog 是一个由爱好者组成的社交联盟。研究产品与软件开发中的最佳解决方案是我们的激情。

CyberCog