Moodle用户登录触发外部请求实现方案咨询
解决方案
一、核心实现方式:利用Moodle事件系统(而非直接修改complete_user_login)
Moodle不建议直接修改核心函数,标准做法是通过事件监听捕获登录完成动作。用户登录成功后,Moodle会触发user_loggedin事件,你可以通过自定义local插件订阅该事件,在回调中完成向Node.js系统的请求发送。
二、快速搭建自定义Local插件(最简结构)
Local插件是Moodle中最适合自定义功能的插件类型,无需修改核心代码,步骤如下:
- 在Moodle的
local/目录下新建logintotrigger/文件夹(命名可自定义) - 新建以下关键文件:
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.
相关产品推荐
相关产品推荐

