edulazaro/larawards

该包最新版本(1.0.9)没有可用的许可信息。

Laravel的奖励系统,允许创建成就或奖杯等奖励。

1.0.9 2024-02-13 08:21 UTC

This package is auto-updated.

Last update: 2024-09-13 09:28:51 UTC


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许可下授权。