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

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官方定义不一致:

  • 初始代码使用的UploadVerifyFile Hook,官方参数顺序为UploadBase $upload, string $mime, string &$error, string[] &$warnings,根本没有User参数。你错误地在第二个参数位置声明了User $user,但实际传入的是字符串类型的$mime,直接触发类型错误。
  • 改用UploadVerifyUpload Hook后,仍未匹配官方签名:该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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 09:24:53