如何在Laravel的helper函数内获取调用它的控制器及对应方法名
实现方案
方案1:通过Laravel路由实例获取(最稳定,推荐)
Laravel内置的路由实例直接存储了当前请求对应的控制器和执行方法,完全不需要依赖异常栈或者额外传参,适配绝大多数HTTP请求场景,稳定性最高:
// helpers.php 实现代码 function logDatabaseError ($exception) { // 从当前路由中提取控制器动作信息 $routeAction = request()->route()->getAction(); // 拆分得到完整控制器类名和方法名 [$controllerClass, $function] = explode('@', $routeAction['controller']); // 提取不带命名空间的控制器类名,刚好匹配你需要的输出格式 $controller = class_basename($controllerClass); $log_string = "TIME: ".now().PHP_EOL; // 优化:Auth::id() 比直接读取Auth::user()->id更稳妥,未登录场景不会抛出新异常 $log_string.= "User ID: ". (Auth::id() ?? '0') .PHP_EOL; $log_string.= "Controller->Action:".$controller."->".$function.PHP_EOL; $log_string.= $exception.PHP_EOL; Storage::disk('logs')->append('database.log', $log_string); }
只要请求是通过Laravel路由调度到控制器方法的,该方案就能稳定拿到值,完全不受异常栈结构变化的影响。
方案2:通过PHP调用栈获取(兼容非HTTP请求场景)
如果该函数也会在命令行、队列任务等无HTTP路由的场景下调用,可以用PHP原生的debug_backtrace获取调用栈,自行控制提取层级,比从异常对象中提取信息可靠很多:
// helpers.php 实现代码 function logDatabaseError ($exception) { // 只取前2层调用栈,忽略参数减少性能消耗 $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2); // 第0层是logDatabaseError函数本身,第1层就是调用该函数的控制器方法 $caller = $trace[1]; $controller = class_basename($caller['class'] ?? 'UnknownController'); $function = $caller['function'] ?? 'UnknownFunction'; $log_string = "TIME: ".now().PHP_EOL; $log_string.= "User ID: ". (Auth::id() ?? '0') .PHP_EOL; $log_string.= "Controller->Action:".$controller."->".$function.PHP_EOL; $log_string.= $exception.PHP_EOL; Storage::disk('logs')->append('database.log', $log_string); }
只要你始终是在控制器的catch块中直接调用logDatabaseError,没有额外中间层嵌套调用的话,调用栈层级就固定不会变,稳定性可以得到保障。如果有中间封装逻辑,调整$trace的索引值即可。
内容的提问来源于stack exchange,提问作者T5k
相关产品推荐
相关产品推荐

