
Laravel Ban 简化了 Eloquent 模型禁令的管理。只需几分钟即可禁止任何模型!
用例不限于用户模型,任何 Eloquent 模型都可能被禁止:组织、团队、组等。
BanService处理。User模型,任何 Eloquent 模型都可能被禁止。ban和unban模特的事件。首先,通过 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= " CogLaravelBanProvidersBanServiceProvider " --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;
}Bannable 模型必须具有名为banned_at的nullable timestamp列。该值用作标志并简化检查用户是否被禁止。如果您尝试将默认的 Laravel 用户模型设为可禁止,您可以使用下面的示例。
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 ;
return new class extends Migration
{
public function up (): void
{
Schema:: table ( ' users ' , function ( Blueprint $ table ) {
$ table -> timestamp ( ' banned_at ' )-> nullable ();
});
}
public function down (): void
{
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属性可以是CarbonCarbon实例或任何可以通过CarbonCarbon::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 ;
}
}如果实体被禁止,则会触发CogLaravelBanEventsModelWasBanned事件。
实体是否被解除禁止CogLaravelBanEventsModelWasUnbanned事件被触发。
该软件包具有路由中间件,旨在防止被禁止的用户访问受保护的路由。
要使用它,请在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 ();
}当然,上面代码中使用的时间只是示例。调整它以适合您自己的喜好。
请参阅变更日志以了解有关最近更改内容的更多信息。
请参阅升级以获取详细的升级说明。
详细信息请参阅贡献。
使用以下命令运行测试:
vendor/bin/phpunit如果您发现任何与安全相关的问题,请发送电子邮件至 [email protected],而不是使用问题跟踪器。
安东·科马列夫 | 巴德尔·阿尔丁·谢克·萨利姆 | 里克·麦克·吉利斯 | 安塞尔C | 乔·阿切尔 |
|---|---|---|---|---|
弗朗西斯科·索利斯 | 雅库布·阿达梅克 | 伊利亚·拉扎列夫 | 泽欧奈特 |
Laravel Ban 贡献者列表
Laravel Ban包是由 Anton Komarev 根据 MIT 许可证授权的开源软件。Fat Boss In Jail图像由 Gan Khoon Lay 获得 Creative Commons 3.0 许可。 CyberCog 是爱好者的社交联盟。研究产品和软件开发的最佳解决方案是我们的热情。