// +---------------------------------------------------------------------- declare (strict_types = 1); namespace addon\demo\subscribe; use think\facade\Log; use ywxapp\service\ScoreService; /** * 积分规则引擎订阅器(插件侧接入示例) * * eventPrefix='Score' => onBefore() 监听 ScoreBefore、onAfter() 监听 ScoreAfter * 需在 info.php 的 events.subscribe 中声明本类(见 addon/demo/info.php)。 * * 三种接入姿势: * 1. 注册自己的动作:ScoreService::registerAction(),后台「触发动作」下拉即可选到 * 2. 改分/取消/注入规则:onBefore() 返回 int 或 ['value'=>n] 覆盖分值、 * false 或 ['cancel'=>true] 取消、['rules'=>[...]] 注入临时规则 * 3. 发放后联动:onAfter() 拿到 rule/value/uid 做通知、成就、等级等 * * 主动发放(不需要事件): * ScoreService::trigger('demo.checkin', $uid, ['date'=>date('Y-m-d')], * ['source'=>'demo', 'source_id'=>'checkin-'.$uid.'-'.date('Ymd')]); */ class Score { protected $eventPrefix = 'Score'; public function __construct() { // 本插件动作注册到后台下拉(插件启用后才可见) ScoreService::registerAction('demo.checkin', '示例-每日签到', 'demo'); } /** * ScoreBefore:发放前干预 * * @param array $payload ['action','uid','context','source','source_id','rules'] * @return array|int|null */ public function onBefore($payload) { ScoreService::registerAction('demo.checkin', '示例-每日签到', 'demo'); $action = (string) ($payload['action'] ?? ''); $rules = $payload['rules'] ?? []; // 示例1:本插件动作在后台没配规则时,动态注入一条默认规则(每日1次、按来源ID去重) if ($action === 'demo.checkin' && empty($rules)) { return [ 'rules' => [[ 'id' => 0, 'title' => '示例签到', 'type' => 1, 'value' => 5, 'limit_type' => ScoreService::LIMIT_DAY, 'limit_times' => 1, 'unique_type' => 1, 'remark' => '示例签到 {date}', ]], ]; } // 示例2:周末双倍(仅对「获取」类规则生效) $first = $rules[0] ?? null; if ($first && (int) ($first['type'] ?? 1) === 1 && in_array(date('w'), ['0', '6'], true)) { return ['value' => (int) ($first['value'] ?? 0) * 2]; } return null; } /** * ScoreAfter:发放后联动 * * @param array $payload ['action','uid','context','source','source_id','rule','value'] */ public function onAfter($payload): void { Log::info('[demo][ScoreAfter] uid=' . ($payload['uid'] ?? 0) . ' action=' . ($payload['action'] ?? '') . ' value=' . ($payload['value'] ?? 0) . ' rule=' . ($payload['rule']['title'] ?? '-')); } }