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

MediaWiki 1.39中PageSaveComplete钩子无法触发的求助

MediaWiki 1.39中PageSaveComplete钩子无法触发的解决方法

问题背景

使用MediaWiki 1.39版本,自定义扩展的extension.json中配置了SpecialStatsAddExtra、PageSaveComplete、PageDeleteComplete三个钩子,其中SpecialStatsAddExtra和PageDeleteComplete能正常执行,但PageSaveComplete始终未被调用——即使在CustomExtension/Hooks.php中写入语法错误,保存页面时也不会报错,且已确认MediaWiki 1.39支持该钩子。

扩展配置文件(extension.json)

{
    "name": "Dcycle Mediawiki Starterkit Custom Extension",
    "version": "1.0.0",
    "author": [
        "Albert Albala"
    ],
    "url": "http://github.com/dcycle/starterkit-mediawiki",
    "descriptionmsg": "dcycle-mediawiki-starterkit-desc",
    "license-name": "GPL-2.0-or-later",
    "type": "other",
    "requires": {
        "MediaWiki": ">= 1.39.0"
    },
    "Hooks": {
        "SpecialStatsAddExtra": "CustomExtension\\Hooks::onSpecialStatsAddExtra",
        "PageSaveComplete": "CustomExtension\\Hooks::onPageSaveComplete",
        "PageDeleteComplete": "CustomExtension\\Hooks::onPageDeleteComplete"
    },
    "JobClasses": {
        "customExtensionUpdateWordCount": "CustomExtension\\Job\\UpdateWordCount"
    },
    "AutoloadNamespaces": {
        "CustomExtension\\": "src/"
    },
    "MessagesDirs": {
        "CustomExtension": [
            "i18n"
        ]
    },
    "manifest_version": 2
}

钩子文件(Hooks.php)

<?php

namespace CustomExtension;

use CustomExtension\JobScheduler\JobScheduler;

/**
 * All CustomExtension's external hooks.
 */
class Hooks {

    public static function onSpecialStatsAddExtra( &$extraStats, $context ) {
        error_log('onSpecialStatsAddExtra is called', 3, "/var/tmp/my-errors.log");
        return TRUE;
    }

    public static function onPageDeleteComplete(\MediaWiki\Page\ProperPageIdentity $page, \MediaWiki\Permissions\Authority $deleter, string $reason, int $pageID, \MediaWiki\Revision\RevisionRecord $deletedRev, \ManualLogEntry $logEntry, int $archivedRevisionCount) {
        error_log('onPageDeleteComplete is called when I delete a page', 3, "/var/tmp/my-errors.log");
        return TRUE;
    }

    public static function onPageSaveComplete(\WikiPage $wikiPage, \MediaWiki\User\UserIdentity $user, string $summary, int $flags, \MediaWiki\Revision\RevisionRecord $revisionRecord, \MediaWiki\Storage\EditResult $editResult) {
        error_log('onPageSaveComplete is never called when I save a page', 3, "/var/tmp/my-errors.log");
        return TRUE;
    }

}

核心问题与解决步骤

1. 修正钩子方法的参数签名

MediaWiki 1.39的PageSaveComplete钩子有严格的参数类型与数量要求,你的方法签名存在两处关键错误:

  • 命名空间错误:\WikiPage已在MediaWiki 1.39中迁移至\MediaWiki\Page\WikiPage命名空间,全局\WikiPage不再有效。
  • 参数缺失与类型不匹配:缺少Status和baseRevId参数,且UserIdentity应替换为User(钩子传递的是User实例,而非更基础的UserIdentity)。

修正后的onPageSaveComplete方法:

public static function onPageSaveComplete(
    \MediaWiki\Page\WikiPage $wikiPage,
    \MediaWiki\User\User $user,
    string $summary,
    int $flags,
    \MediaWiki\Revision\RevisionRecord $revisionRecord,
    \MediaWiki\Status\Status $status,
    int $baseRevId,
    \MediaWiki\Storage\EditResult $editResult
) {
    error_log('onPageSaveComplete is called when I save a page', 3, "/var/tmp/my-errors.log");
    return true;
}

2. 刷新MediaWiki缓存

MediaWiki会缓存钩子注册信息,修改钩子后需强制刷新缓存:
在MediaWiki根目录执行以下维护脚本:

php maintenance/update.php
php maintenance/rebuildCache.php

也可直接删除MediaWiki的cache目录下的所有文件,确保新配置生效。

3. 验证类加载路径

确认Hooks.php的文件路径与AutoloadNamespaces配置匹配:

  • 配置中"CustomExtension\\": "src/"意味着CustomExtension\Hooks类对应的文件路径应为src/Hooks.php。
  • 如果你的文件放在src/CustomExtension/Hooks.php,需将AutoloadNamespaces改为"CustomExtension\\": "src/CustomExtension/",或者调整文件路径至src/下。

4. 检查错误日志

查看MediaWiki的调试日志(可在LocalSettings.php中通过$wgDebugLogGroups配置)或Web服务器的PHP错误日志,确认是否存在类加载失败、参数不匹配等警告信息,辅助排查剩余问题。

内容的提问来源于stack exchange,提问作者alberto56

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 01:00:59