hkp22 / laravel-bannable
Requires
- php: >=7.0
- illuminate/database: 5.5.*|5.6.*|5.7.*|5.8.*|^6.0|^7.0|^8.0
- illuminate/events: 5.5.*|5.6.*|5.7.*|5.8.*|^6.0|^7.0|^8.0
- illuminate/support: 5.5.*|5.6.*|5.7.*|5.8.*|^6.0|^7.0|^8.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.16
- orchestra/testbench: ~3.5.0|~3.6.0|~3.7.0|~3.8.0|^4.0|^5.0|^6.0
- phpunit/phpunit: ^7.5|^8.0|^9.0
This package is auto-updated.
Last update: 2022-02-01 13:14:00 UTC
README
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, ]