我有一个配置文件,其中包含这样的数组:
'ppr' => [
'validate' => TestRequest::class
];
现在,我想在系统的其他部分检索这个类,并使用它来验证表单(控制器之外)。
在使用config('main.ppr.validate')
时,我所收到的只是类的命名空间名称,而不是类对象。
由于我已经接受了仅仅在控制器中使用reuqest并不那么容易,所以我仍然想知道如何通过配置传递一个类。当传递雄辩的模型时,它的工作方式就像一个魅力(或者配置数组与中间件等),所以我想IoC应该有一些神奇的绑定来实现这一点,是真的吗?
我的问题是,如何使用像上面那样传递的类,而不像那样初始化它:
$obj = new $className;
发布于 2018-12-14 21:53:42
Laravel (和许多其他应用程序)使用依赖注入来实现这一魔力--你的话,而不是我的!:D
服务容器似乎是在Laravel中处理这个问题的工具,应该对你有帮助。
直接来自Laravel文档(上文链接):
在服务提供者中,您始终可以通过$this->app属性访问容器。我们可以使用bind方法注册绑定,传递我们希望注册的类或接口名称以及返回类实例的闭包:
$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]);
IMHO,我将查找在本地Laravel代码(通常是照明供应商)中实现它的位置/方式,并查看它是如何使用/如何实现的。
此外,ClassName::class
将返回该类的命名空间+类。这就是为什么您只看到类名而没有实际接收到该类的对象/实例。
我不知道您是如何实现类的/在哪里/为什么/如何实现的,以及为什么您需要这个功能,而这个功能还不存在。Laravel很擅长在你需要的地方设置好东西,所以在打破盒子之前要三思而行,并确保你的情况没有默认的解决方案!
https://stackoverflow.com/questions/53787213
复制相似问题