Laravel 9中如何通过变量传递类名动态实例化类?
Laravel 9动态调用控制器类方法报错解决
我在Laravel 9开发中遇到了PHP相关问题,需求是动态调用控制器的方法来获取数据:
控制器代码
我有一个HomeController.php控制器,里面包含返回数据的getData()方法:
<?php namespace App\Http\Controllers; class HomeController { public function getData() { return [/* 我的数据 */]; } }
尝试的动态调用代码
我想通过动态方式调用这个类和方法,将返回值赋值给$data,于是写了如下Example类:
<?php use App\Http\Controllers\HomeController; class Example { public $className = 'HomeController'; public $method = 'getData'; public function index() { $instance = new $this->className; $method = $this->method; $data = $instance->$method(); } }
问题
运行时出现错误:Class "HomeController" not found,但如果把$this->className直接替换为HomeController(硬编码类名)就能正常运行。
注意:$className是从其他地方传入的,我希望避免在Example类中硬编码类名。我知道需要在顶部引入相关类,但不确定是否可以通过这种方式传递类名,也怀疑有没有动态引入类的办法。
已验证的解决方案
评论区Tim提供的方案有效,修复后的代码如下:
<?php use App\Http\Controllers\HomeController; class Example { public $className = 'App\\Http\\Controllers\\HomeController'; // 修改1:使用完整类名(命名空间+类名) public $method = 'getData'; public function index() { $instance = app()->make($this->className); // 修改2:通过Laravel容器实例化类 $method = $this->method; $data = $instance->$method(); } }
内容的提问来源于stack exchange,提问作者RgFirefly
相关产品推荐
相关产品推荐

