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

问题描述 投票:0回答:1

如果在控制器中使用类似的东西

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

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

我检查了抽象类Illuminate\Routing\Controller,它只有4个方法,并且没有一个主题似乎可以做到这一点。我也注意到,如果我做了类似的事情

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

然后每当调用send()时,这将抛出Too few arguments to function..错误。

我不知道在哪里可以看。如果我谷歌我的问题,我发现很多帖子解释如何使用type hint但不知道它是如何工作的。

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

php laravel dependency-injection
1个回答
1
投票

它实际上没有使用容器来奇怪地调用你的控制器方法,即使控制器本身是从容器解析(这将给你从容器注入构造函数)

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

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

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

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

它正在做类似于容器的call方法。

© www.soinside.com 2019 - 2024. All rights reserved.