edulazaro / larawards
Laravel的奖励系统,允许创建成就或奖杯等奖励。
Requires
- php: >=8.1
- laravel/framework: >=9
README
在Laravel上实现成就的一种方法。
如何安装Larawards
在Laravel根项目文件夹中执行此命令
composer require edulazaro/larawards
在.env
文件中配置数据库详情,并使用以下命令执行迁移
php artisan migrate
创建新奖项
要创建一个新奖项(成就、奖杯、徽章...),使用此命令,将FooAchievement
替换为奖项类名
php artisan make:award FooAchievement
这将创建一个新的奖项在app/Awards/FooAchievement.php
。
奖项可以是不同类型,如成就
或徽章
。要设置类型,请使用$type
属性
/** @var string The award type. */ public $type = 'achievement';
奖项可以有一个或多个级别。每个级别是某种可以授予的东西,比如一个成就。级别允许在单个文件中定义类似成就
/** @var protected The award tiers. */ protected array $tiers = [ 'comment_written' => [ 'score' => 1, 'title' => 'First Comment Written', ], '3_comments_written' => [ 'score' => 3, 'title' => '3 Comments Written', ], '5_comments_written' => [ 'score' => 5, 'title' => '5 Comments Written', ], '10_comments_written' => [ 'score' => 10, 'title' => '10 Comments Written', ], '20_comments_written' => [ 'score' => 20, 'title' => '20 Comments Written', ], ];
每个级别都有一个标题
,这是成就/徽章的名称,还有一个分数
,这是奖励用户成就/徽章所需的分数。
最后,score
方法是在哪里编写逻辑以检索awardablep
用户的当前奖项分数的地方
/** * Get the awardable score a user * * @return int */ public function score(): int { return $this->rewardable->comments()->count(); }
注册奖项
如果您想让一个模型接受奖励,您需要将HasWards
特质用于它,如下例所示
namespace App\Models; use EduLazaro\Larawards\Concerns\HasRewards; class User { use HasRewards; }
应该使用AwardProvider
将成就注册到User模型或其他包含HasRewards
特质的模型中
User::awardable(AchievementsBadge::class);
或分组
User::awardableGroup('achievements', [ CommentsAchievement::class, LessonsWatchedAchievement::class ]);
奖项可以注册到使用HasRewards
特质的任何模型。
检查奖励
当您需要检查奖项时,可以这样做
FooAchievement::scope($user)->check();
如您所见,首先需要将奖项限定到用户。这将添加奖励,如果它符合任何级别的需求。awardables。
您还可以一次性执行多个查询来检查多个奖项。
User::awardables()->check();
您也可以选择一个特定的组
User::awardables()->group('top_awards')->check();
或一个特定的类型
User::awardables()->where('type', 'achievement')->check();
一旦授予奖项,它将被添加到rewards
表中。
奖励事件
如果您想,您可以使用$event
属性指定要触发的事件
namespace App\Awards; use EduLazaro\Larawards\Concerns\IsAward; use EduLazaro\Larawards\Contracts\AwardInterface; use App\Events\AchievementUnlocked; class CommentsAchievement implements AwardInterface { use IsAward; // ... protected string $event = AchievementUnlocked::class; // ... }
每次用户获得奖励时,都会触发此事件。
检查奖项
要获取用户的奖励,您可以这样做
$rewards = $user->rewards;
要检查是否已授予特定奖项和级别
$isRewarded = $user->rewards()->where('name', 'comment_written')->exists();
您可以查询许多用户的奖励
use EduLazaro\Larawards\Models\Reward; // ... Reward::where('award_id', 'comments_achievement')->get();
奖项形态映射
这与标准的Laravel形态映射工作方式相同。
当奖励被插入数据库时,奖励ID将是定义奖项的类。但是这看起来很丑。为了解决这个问题,请在任何服务提供商上使用Award::enforceMap
方法
namespace App\Providers; use Illuminate\Support\ServiceProvider; use EduLazaro\Larawards\Collections\Awards; use App\Awards\CommentsAchievement; use App\Awards\LikesAchievement; class AwardServiceProvider extends ServiceProvider { /** * Bootstrap any application services. */ public function boot(): void { Awards::enforceMap([ 'comments_achievement' => CommentsAchievement::class, 'likes_achievement' => LikesAchievement::class, ]); } }
这将分配指定的别名到指定的奖项类。例如,App\Awards\CommentsAchievement
将表示为comments_achievement
,这使得它更易读。
许可
Laravel框架是开源软件,在MIT许可下授权。