如果在控制器中使用类似
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
,而不是其实际工作原理。
那么,如果我在控制器中键入提示,从服务容器中解析对象的那段代码在哪里?
答案 0 :(得分:1)
实际上,即使控制器本身是从容器中解析出来的,它也不会足够奇怪地使用容器来调用您的控制器方法(这将使您从容器中注入构造函数)
Illuminate\Routing\Route@run
-> runController()
->
Illuminate\Routing\ControllerDispatcher
使用Illuminate\Routing\RouteDependencyResolverTrait
resolveClassMethodDependencies() -> resolveMethodDependencies()
...在此过程中,使用该容器为通过直接反射收集的依赖项解析实例。
ControllerDispatcher
最终调用了您的方法并将已解析的参数传递给它。
它正在执行与容器的call
方法相似的操作。