notchafrica / ban
Laravel Ban简化了Eloquent模型禁用和封禁的过程。
Requires
- php: ^8.0
- illuminate/database: ^9.0|^10.0
- illuminate/events: ^9.0|^10.0
- illuminate/support: ^9.0|^10.0
Requires (Dev)
- laravel/legacy-factories: ^1.3
- mockery/mockery: ^1.0
- orchestra/testbench: ^7.0|^8.0
- phpunit/phpunit: ^9.6
README
介绍
Laravel Ban简化了Eloquent模型禁用的管理。几分钟内使任何模型可被禁用!
用例不仅限于User模型,任何Eloquent模型都可以被禁用:组织、团队、组和其他。
内容
功能
- 模型可以有多个禁用。
- 被移除的禁用记录作为软删除记录保留在历史中。
- 大部分逻辑由
BanService
处理。 - 具有中间件以防止被禁用用户的路由访问。
- 用例不仅限于
User
模型,任何Eloquent模型都可以被禁用。 - 在模型上触发
ban
和unban
事件。 - 设计为与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_at
的nullable 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
软件包是开源软件,由 MIT 许可证 下 Anton Komarev 授权。Fat Boss In Jail
图片由 Gan Khoon Lay 授权,许可协议为 Creative Commons 3.0。
🌟 随时间变化的星标数量
关于CyberCog
CyberCog 是一个由爱好者组成的社交联盟。研究产品与软件开发中的最佳解决方案是我们的激情。