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规范)
视图层应仅负责展示,业务逻辑建议抽离到服务类:
- 创建服务类
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; } }
- 在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
相关产品推荐
相关产品推荐

