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
相关产品推荐
相关产品推荐

