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

If one uses in a controller something like

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

then whenever the function send() is called without input, Laravel will automatically resolve the Request object from the Service Container. But where and how is this magic happening?

I checked the abstract class Illuminate\Routing\Controller which only has 4 methods, and none of theme seems to do the trick. I also noticed that if I do something like

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

then whenever calling send() this will throw an Too few arguments to function.. error.

I don't know where else to look. If I google my question, I find plenty of post explaining how to use type hint but not how it actually works.

So where is the piece of code that resolves the object from the Service Container if I type hint it in a controller?

It actually doesn't use the container to call your controller method oddly enough even though the controller itself is resolved from the container (which would give you constructor injection from the container)

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

Illuminate\Routing\ControllerDispatcher uses Illuminate\Routing\RouteDependencyResolverTrait

resolveClassMethodDependencies() -> resolveMethodDependencies() ... during this process is where the container is used to resolve instances for the dependencies that were gathered by direct reflection.

The ControllerDispatcher ends up calling your method and passing the resolved parameters to it.

It is doing what would seem similar to the container's call method.