You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Moodle用户登录触发外部请求实现方案咨询

解决方案

一、核心实现方式:利用Moodle事件系统(而非直接修改complete_user_login)

Moodle不建议直接修改核心函数,标准做法是通过事件监听捕获登录完成动作。用户登录成功后,Moodle会触发user_loggedin事件,你可以通过自定义local插件订阅该事件,在回调中完成向Node.js系统的请求发送。

二、快速搭建自定义Local插件(最简结构)

Local插件是Moodle中最适合自定义功能的插件类型,无需修改核心代码,步骤如下:

  1. 在Moodle的local/目录下新建logintotrigger/文件夹(命名可自定义)
  2. 新建以下关键文件:
    • version.php:插件元信息
    • db/events.php:事件订阅配置
    • classes/event_observer.php:事件监听回调类

1. version.php 示例

<?php
defined('MOODLE_INTERNAL') || die();

$plugin->version   = 2024052000;        // 版本号,格式为YYYYMMDDXX
$plugin->requires  = 2022041900;        // 最低支持的Moodle版本(比如4.0)
$plugin->component = 'local_logintotrigger'; // 插件标识,必须和文件夹名一致
$plugin->maturity  = MATURITY_STABLE;
$plugin->release   = '1.0';

2. db/events.php 示例(订阅登录事件)

<?php
defined('MOODLE_INTERNAL') || die();

$observers = [
    [
        'eventname' => '\core\event\user_loggedin',
        'callback' => '\local_logintotrigger\event_observer::handle_user_loggedin',
        'internal' => false,
    ],
];

3. classes/event_observer.php 示例(核心逻辑)

<?php
namespace local_logintotrigger;

defined('MOODLE_INTERNAL') || die();

class event_observer {
    public static function handle_user_loggedin(\core\event\user_loggedin $event) {
        // 获取登录用户对象
        $user = $event->get_record_snapshot('user', $event->objectid);
        
        // 获取用户所属的Cohort(群组)
        $cohorts = \core_cohort\api::get_user_cohorts($user->id);
        // 整理cohort信息,按需提取id/name等字段
        $userCohorts = array_column($cohorts, 'id');
        
        // 准备向Node.js发送的请求数据
        $postData = [
            'userID' => $user->id,
            'userCohort' => $userCohorts
        ];
        
        // 使用Moodle自带的CURL类发送请求(兼容环境配置)
        $curl = new \curl();
        $nodejsUrl = 'http://你的Node.js服务地址/api/handle-login'; // 替换为实际地址
        $options = [
            'CURLOPT_POST' => true,
            'CURLOPT_POSTFIELDS' => json_encode($postData),
            'CURLOPT_HTTPHEADER' => ['Content-Type: application/json'],
        ];
        
        // 发送请求(可忽略返回值,按需处理)
        $response = $curl->post($nodejsUrl, $postData, $options);
        
        // 可选:记录调试日志
        debugging('Sent login trigger to Node.js for user ' . $user->id . ', response: ' . $response, DEBUG_DEVELOPER);
    }
}

三、关键知识点说明

  • 获取用户Cohort:使用\core_cohort\api::get_user_cohorts($userid)可获取用户所属所有群组,返回包含cohort详情的数组,按需提取字段即可。
  • HTTP请求发送:优先用Moodle封装的\curl类,而非原生curl,它已处理代理、SSL等环境配置问题。
  • 插件安装:文件创建完成后,进入Moodle后台「站点管理」->「插件」->「安装插件」,系统会自动检测并安装。

四、参考文档(Moodle官方)

  • Local插件开发指南:Moodle开发者文档中「Local plugins」章节,涵盖插件结构、事件订阅等基础内容
  • Moodle事件系统:核心事件列表及监听方法,查看「Event API」文档
  • Cohort API:core_cohort相关函数使用说明,在Moodle「API Documentation」中搜索cohort即可

五、可参考的现有插件

  • local_webhooks:支持配置事件触发时发送HTTP请求,可参考其事件监听与请求发送逻辑,甚至直接基于它修改
  • local_loginredirect:虽用于登录跳转,但登录事件监听逻辑可作为基础参考

内容的提问来源于stack exchange,提问作者Michel H.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 19:45:30