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

Laravel:Blade调用控制器非静态方法报错的解决问询

问题:Blade模板中调用控制器非静态方法报错

错误信息:Error Non-static method App\Http\Controllers\CallDetailsController::insertVicidialReportLog() cannot be called statically (View: /var/www/html/vicidiallaravel/resources/views/reports/call_report_export.blade.php)

相关代码

CallDetailsController.php

public function insertVicidialReportLog($webserver_id,$authUser,$userId,$reportName,$query_date,$end_date,$shift,$file_download,$report_display_type) { 
    //return $authUser; // die(); 
    // ##### BEGIN log visit to the vicidial_report_log table ##### 
    $LOGip = $_SERVER["REMOTE_ADDR"]; 
    $LOGbrowser = $_SERVER["HTTP_USER_AGENT"]; 
    $LOGscript_name = $_SERVER["SCRIPT_NAME"]; 
    $LOGserver_name = $_SERVER["SERVER_NAME"]; 
    $LOGserver_port = $_SERVER["SERVER_PORT"]; 
    $LOGrequest_uri = $_SERVER["REQUEST_URI"]; 
    $LOGhttp_referer = $_SERVER["HTTP_REFERER"]; 

    $LOGbrowser=preg_replace("/\'|\"|\\\\/","",$LOGbrowser); 
    $LOGrequest_uri=preg_replace("/\'|\"|\\\\/","",$LOGrequest_uri); 
    $LOGhttp_referer=preg_replace("/\'|\"|\\\\/","",$LOGhttp_referer); 

    if (preg_match("/443/i",$LOGserver_port)) {$HTTPprotocol = 'https://';} else {$HTTPprotocol = 'http://';} 
    if (($LOGserver_port == '80') or ($LOGserver_port == '443') ) {$LOGserver_port='';} else {$LOGserver_port = ":$LOGserver_port";} 
    $LOGfull_url = "$HTTPprotocol$LOGserver_name$LOGserver_port$LOGrequest_uri"; 

    $LOGhostname = php_uname('n'); 
    if (strlen($LOGhostname)<1) {$LOGhostname='X';} 
    if (strlen($LOGserver_name)<1) {$LOGserver_name='X';} 

    $insertReportLog = DB::table('vicidial_report_log')->insertGetId([ 
        'event_date' => NOW(), 
        'user' => $authUser, 
        'ip_address' => $LOGip, 
        'report_name' => $reportName, 
        'browser' => $LOGbrowser, 
        'referer' => $LOGhttp_referer, 
        'notes' => "$LOGserver_name:$LOGserver_port $LOGscript_name |$query_date, $end_date, $shift, $file_download, $report_display_type|", 
        'url' => "$LOGfull_url", 
        'webserver' => "$webserver_id", 
    ]); 
    return $insertReportLog; 
}

call_report_export.blade.php

$stmt = App\Http\Controllers\CallDetailsController::insertVicidialReportLog($webserver_id,$PHP_AUTH_USER,$PHP_AUTH_USER_ID,$report_name,$query_date,$end_date,$shift,$file_download,$report_display_type);

解决方法

方案一:实例化控制器调用方法(快速临时解决)

直接在Blade中创建控制器实例后调用方法:

$controller = new App\Http\Controllers\CallDetailsController();
$stmt = $controller->insertVicidialReportLog($webserver_id,$PHP_AUTH_USER,$PHP_AUTH_USER_ID,$report_name,$query_date,$end_date,$shift,$file_download,$report_display_type);

方案二:将方法改为静态方法(简单直接)

修改CallDetailsController.php中的方法,添加static关键字:

public static function insertVicidialReportLog($webserver_id,$authUser,$userId,$reportName,$query_date,$end_date,$shift,$file_download,$report_display_type) { 
    // 原方法代码保持不变
}

修改后Blade中的调用代码无需改动。

方案三:迁移逻辑到服务类(符合Laravel MVC规范)

视图层应仅负责展示,业务逻辑建议抽离到服务类:

  1. 创建服务类app/Services/ReportLogService.php:
namespace App\Services;

use Illuminate\Support\Facades\DB;

class ReportLogService {
    public static function insertVicidialReportLog($webserver_id,$authUser,$userId,$reportName,$query_date,$end_date,$shift,$file_download,$report_display_type) { 
        $LOGip = $_SERVER["REMOTE_ADDR"]; 
        $LOGbrowser = $_SERVER["HTTP_USER_AGENT"]; 
        $LOGscript_name = $_SERVER["SCRIPT_NAME"]; 
        $LOGserver_name = $_SERVER["SERVER_NAME"]; 
        $LOGserver_port = $_SERVER["SERVER_PORT"]; 
        $LOGrequest_uri = $_SERVER["REQUEST_URI"]; 
        $LOGhttp_referer = $_SERVER["HTTP_REFERER"]; 

        $LOGbrowser=preg_replace("/\'|\"|\\\\/","",$LOGbrowser); 
        $LOGrequest_uri=preg_replace("/\'|\"|\\\\/","",$LOGrequest_uri); 
        $LOGhttp_referer=preg_replace("/\'|\"|\\\\/","",$LOGhttp_referer); 

        if (preg_match("/443/i",$LOGserver_port)) {$HTTPprotocol = 'https://';} else {$HTTPprotocol = 'http://';} 
        if (($LOGserver_port == '80') or ($LOGserver_port == '443') ) {$LOGserver_port='';} else {$LOGserver_port = ":$LOGserver_port";} 
        $LOGfull_url = "$HTTPprotocol$LOGserver_name$LOGserver_port$LOGrequest_uri"; 

        $LOGhostname = php_uname('n'); 
        if (strlen($LOGhostname)<1) {$LOGhostname='X';} 
        if (strlen($LOGserver_name)<1) {$LOGserver_name='X';} 

        $insertReportLog = DB::table('vicidial_report_log')->insertGetId([ 
            'event_date' => NOW(), 
            'user' => $authUser, 
            'ip_address' => $LOGip, 
            'report_name' => $reportName, 
            'browser' => $LOGbrowser, 
            'referer' => $LOGhttp_referer, 
            'notes' => "$LOGserver_name:$LOGserver_port $LOGscript_name |$query_date, $end_date, $shift, $file_download, $report_display_type|", 
            'url' => "$LOGfull_url", 
            'webserver' => "$webserver_id", 
        ]); 
        return $insertReportLog; 
    }
}
  1. 在Blade中调用服务类方法:
use App\Services\ReportLogService;

$stmt = ReportLogService::insertVicidialReportLog($webserver_id,$PHP_AUTH_USER,$PHP_AUTH_USER_ID,$report_name,$query_date,$end_date,$shift,$file_download,$report_display_type);

方案四:控制器处理逻辑后传值到视图(最规范)

在渲染视图的控制器方法中完成逻辑调用,将结果传递给视图:

public function exportReport() {
    // 自行获取所需参数$webserver_id、$PHP_AUTH_USER等
    $stmt = $this->insertVicidialReportLog($webserver_id,$PHP_AUTH_USER,$PHP_AUTH_USER_ID,$report_name,$query_date,$end_date,$shift,$file_download,$report_display_type);
    return view('reports.call_report_export', compact('stmt'));
}

此时Blade中直接使用$stmt变量即可,无需在视图内调用方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 16:39:21