MediaWiki视频上传权限扩展TypeError错误排查求助
解决MediaWiki扩展视频上传权限管控的TypeError错误
错误信息
TypeError: Argument 2 passed to VideoPermissionsHooks::onUploadVerifyFile() must be an instance of User, string given
问题背景
开发MediaWiki扩展用于管控用户视频文件上传权限时,始终遇到上述类型不匹配错误。尝试按照文档要求不使用全局wgUser、改用参数传入后,问题仍未解决。
相关代码及修改过程
初始VideoPermissionsHooks.php代码
<?php class VideoPermissionsHooks { /** * Hook: BeforePageDisplay * @param OutputPage $out * @param Skin $skin */ public static function onBeforePageDisplay( OutputPage &$out, Skin &$skin ) { // Check if the user has permission to view videos if ( !$out->getUser()->isAllowed( 'view_video' ) ) { $out->addModules( 'ext.VideoPermissions.noVideo' ); } } /** * Hook: UploadVerifyFile * @param UploadBase $upload * @param User $user * @param string $mime * @param bool $error * @param string[] &$warnings * @return bool */ public static function onUploadVerifyFile( $upload, User $user, $mime, &$error, array &$warnings ) { global $wgVideoPermissionEnable; // Check if video permissions feature is enabled if ( !$wgVideoPermissionEnable ) { return true; // Bypass checks if the feature is disabled } $fileName = $upload->getLocalFile()->getName(); $fileExtension = strtolower( pathinfo( $fileName, PATHINFO_EXTENSION ) ); // Verify if the user has permission to upload video files if ( $fileExtension === 'mp4' ) { if ( !$user->isAllowed( 'upload_video' ) ) { $error = 'You do not have permission to upload video files.'; return false; } } return true; } }
第一次修改后的函数
public static function onUploadVerifyUpload( UploadBase $upload, User $user, $mime, &$error, array &$warnings ) { MWDebug::log( __METHOD__ . ": onUploadVerifyFile function called" ); MWDebug::log( __METHOD__ . ": Type of \$user: " . (is_object($user) ? get_class($user) : gettype($user)) ); MWDebug::log( __METHOD__ . ": Value of \$user: " . print_r($user, true) ); if (is_string($user)) { MWDebug::log( __METHOD__ . ": Error: \$user is a string" ); } global $wgVideoPermissionEnable; // Check if video permissions feature is enabled if (!$wgVideoPermissionEnable) { return true; // Bypass checks if the feature is disabled } // Get the file name $fileName = $upload->getLocalFile()->getName(); MWDebug::log( __METHOD__ . ": File name: " . $fileName ); // Extract the file extension $fileExtension = strtolower(pathinfo($fileName, PATHINFO_EXTENSION)); MWDebug::log( __METHOD__ . ": File extension: " . $fileExtension ); // Verify if the user has permission to upload video files if ($fileExtension === 'mp4') { if (!$user->isAllowed('upload_video')) { $warnings[] = ['upload-video-permission-warning', $user->getName(), $fileName]; MWDebug::log( __METHOD__ . ": User does not have permission to upload video files" ); return false; // Prevent the upload } } return true; // Allow the upload }
UPDATE #2:配置文件与修改后的代码
LocalSettings.php
$wgEnableUploads = true; # Specify permitted file types $wgFileExtensions = array('png', 'gif', 'jpg', 'jpeg', 'pdf', 'doc','mp4'); $wgGroupPermissions['*']['upload_video'] = false; $wgGroupPermissions['*']['view_video'] = false;
VideoPermissionsHooks.php
<?php class VideoPermissionsHooks { /** * Hook: BeforePageDisplay * @param OutputPage $out * @param Skin $skin */ public static function onBeforePageDisplay( OutputPage &$out, Skin &$skin ) { // Check if the user has permission to view videos if ( !$out->getUser()->isAllowed( 'view_video' ) ) { $out->addModules( 'ext.VideoPermissions.noVideo' ); } } /** * Hook: UploadVerifyUpload * @param UploadBase $upload * @param User $user * @param string $pageText * @param string &$error */ public static function onUploadVerifyUpload( UploadBase $upload, User $user, $pageText, &$error ) { $fileName = strtolower( pathinfo( $upload->getLocalFile()->getName(), PATHINFO_EXTENSION ) ); global $wgVideoPermissionEnable; if ( $wgVideoPermissionEnable && $fileName === 'mp4' && !$user->isAllowed( 'upload_video' ) ) { $error = [ 'upload-video-permission-warning', $user->getName(), $fileName ]; } } }
问题根源与解决办法
1. 核心问题:Hook函数签名不匹配
你遇到的TypeError完全是因为自定义Hook函数的参数签名和MediaWiki官方定义不一致:
- 初始代码使用的
UploadVerifyFileHook,官方参数顺序为UploadBase $upload, string $mime, string &$error, string[] &$warnings,根本没有User参数。你错误地在第二个参数位置声明了User $user,但实际传入的是字符串类型的$mime,直接触发类型错误。 - 改用
UploadVerifyUploadHook后,仍未匹配官方签名:该Hook的第二个参数是引用传递的User对象(User &$user),且第三个参数是$pageText而非$mime,你的函数声明既没加引用符号,参数顺序也错了,导致类型校验失败。
2. 正确实现步骤
步骤1:匹配官方Hook签名
UploadVerifyUpload的官方参数签名为:
public static function onUploadVerifyUpload( UploadBase $upload, User &$user, string $pageText, string &$error ): bool
注意:
User参数需用引用传递(&$user)- 函数必须返回布尔值,
true允许上传,false阻止上传
步骤2:修正Hook函数代码
修改VideoPermissionsHooks.php中的onUploadVerifyUpload方法:
/** * Hook: UploadVerifyUpload * @param UploadBase $upload * @param User &$user * @param string $pageText * @param string &$error * @return bool */ public static function onUploadVerifyUpload( UploadBase $upload, User &$user, string $pageText, string &$error ): bool { global $wgVideoPermissionEnable; // 功能未启用时直接放行 if ( !$wgVideoPermissionEnable ) { return true; } // 获取上传文件扩展名(建议用getFileName,此时文件尚未保存) $fileExtension = strtolower( pathinfo( $upload->getFileName(), PATHINFO_EXTENSION ) ); // 仅对MP4文件做权限校验 if ( $fileExtension === 'mp4' ) { if ( !$user->isAllowed( 'upload_video' ) ) { // 使用MediaWiki消息系统返回错误(需提前在i18n文件定义该消息) $error = wfMessage( 'upload-video-permission-warning', $user->getName(), $upload->getFileName() )->text(); return false; // 阻止上传 } } return true; // 允许上传 }
步骤3:完善LocalSettings配置
补充缺失的扩展启用开关,并细化权限配置:
$wgEnableUploads = true; $wgFileExtensions = array('png', 'gif', 'jpg', 'jpeg', 'pdf', 'doc','mp4'); // 权限配置 $wgGroupPermissions['*']['upload_video'] = false; // 匿名用户禁止上传视频 $wgGroupPermissions['user']['upload_video'] = false; // 普通注册用户默认禁止 $wgGroupPermissions['sysop']['upload_video'] = true; // 管理员允许上传视频 $wgGroupPermissions['*']['view_video'] = false; $wgVideoPermissionEnable = true; // 启用视频权限管控功能
步骤4:确认Hook注册
在扩展的extension.json中正确注册Hook:
{ "Hooks": { "BeforePageDisplay": "VideoPermissionsHooks::onBeforePageDisplay", "UploadVerifyUpload": "VideoPermissionsHooks::onUploadVerifyUpload" } }
内容的提问来源于stack exchange,提问作者Timmy
相关产品推荐
相关产品推荐

