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.