我有一个带有此类数组的配置文件:
'ppr' => [
'validate' => TestRequest::class
];
现在,我想在系统的其他部分中检索该类,并使用它来验证表单(在控制器外部)。
使用config('main.ppr.validate')
时,我收到的只是类的命名空间名称,而不是类对象。
由于我已经接受了像在控制器中那样使用reuqest并不是那么容易,所以我仍然想知道如何通过config传递类。 在传递有说服力的模型时,它就像一个魅力(或带有中间件的配置数组等)一样工作,因此我想对IoC进行某种魔术绑定就可以实现这一点,这是真的吗?
我的问题是,如何使用如上示例中通过的类而无需对其进行初始化:
$obj = new $className;
答案 0 :(得分:3)
Laravel(和许多其他应用程序)使用Dependency Injection来实现这种魔术 -您的话,不是我的! :D
看来Service Container是在Laravel中处理此问题的人,应该对您有帮助。
直接来自Laravel文档(上面链接):
在服务提供商内部,您始终可以通过$ this-> app属性访问容器。我们可以使用bind方法注册绑定,传递要注册的类或接口名称以及返回类实例的Closure:
$this->app->bind('HelpSpot\API', function ($app) {
return new HelpSpot\API($app->make('HttpClient'));
});
也:
您可以使用make方法从容器中解析类实例。 make方法接受您要解析的类或接口的名称:
$api = $this->app->make('HelpSpot\API');
并且:
如果某些类的依赖项无法通过容器解析,则可以通过将它们作为关联数组传递给makeWith方法来注入它们:
$api = $this->app->makeWith('HelpSpot\API', ['id' => 1]);
恕我直言,我将查找在本地Laravel代码(通常是Illuminate供应商)中在何处/如何实现它,并查看如何使用/打算实现它。
此外,ClassName::class
将返回该类的名称空间+类。这就是为什么您只看到类名而实际上没有收到该类的对象/实例的原因。
我不确定您要在什么/何处/为什么/如何实现您的类,以及为什么需要在尚不存在的地方使用此功能。 Laravel非常擅长在需要的地方进行设置,因此请三思而后行,并确保没有适合您情况的默认解决方案!