qirolab / laravel-bannable
Laravel bannable包用于阻止和禁止Eloquent模型。
Requires
- php: >=7.3
- illuminate/database: ^8.0|^9.0|^10.0|^11.0
- illuminate/events: ^8.0|^9.0|^10.0|^11.0
- illuminate/support: ^8.0|^9.0|^10.0|^11.0
Requires (Dev)
- orchestra/testbench: ^6.0|^7.0|^8.0|^9.0
- phpunit/phpunit: ^8.5|^9.0|^10.5
- vimeo/psalm: ^4.0|^5.22
This package is auto-updated.
Last update: 2024-09-07 17:35:48 UTC
README
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, ]