Laravel:带有类型提示的依赖注入如何工作?

时间:2018-08-06 04:51:31

标签: php laravel dependency-injection

如果在控制器中使用类似

class ContactController extends Controller
{
    public function send(Request $request)
    {
        //...

然后,每当无输入调用函数send()时,Laravel will automatically resolve the Request object from the Service Container但是这种魔术在哪里发生以及如何发生?

我检查了只有4种方法的抽象类Illuminate\Routing\Controller,但似乎没有主题可以解决问题。我还注意到,如果我做类似的事情

class ContactController 
{
    public function send(Request $request)
    {
       //...

然后,每当调用send()时,都会引发Too few arguments to function..错误。

我不知道还能去哪里。如果我用谷歌搜索我的问题,我会找到大量的帖子来解释如何使用type hint,而不是其实际工作原理。

那么,如果我在控制器中键入提示,从服务容器中解析对象的那段代码在哪里?

1 个答案:

答案 0 :(得分:1)

实际上,即使控制器本身是从容器中解析出来的,它也不会足够奇怪地使用容器来调用您的控制器方法(这将使您从容器中注入构造函数)

Illuminate\Routing\Route@run-> runController()->

Illuminate\Routing\ControllerDispatcher使用Illuminate\Routing\RouteDependencyResolverTrait

resolveClassMethodDependencies() -> resolveMethodDependencies() ...在此过程中,使用该容器为通过直接反射收集的依赖项解析实例。

ControllerDispatcher最终调用了您的方法并将已解析的参数传递给它。

它正在执行与容器的call方法相似的操作。