为什么用了依赖注入的函数可以直接访问但是调用它却要传参?

比如用了依赖注入的函数放在控制器里可以直接在curl访问
image.png

但是当成函数调用的时候却必须传参,这是为何?
image.png

image.png

阅读 2.8k
2 个回答

因为你直接调用函数,并没有经过容器。
容器还有一个 call 方法,传递参数类似于 call_user_func_array ,只是其还多了第三个参数,默认方法。

其次,第一个参数可以是路由那样的 命名空间/类名@方法名 ,也可以是 [对象,方法名],的形式去传递。
第二个参数中,对象值在容器中有注册挂载的,会自动处理,你也可以手动指定,通过数组键值对的方式,

比如 esCanShowQueryBuilder 对象,你可以不传递第二个参数,就会自动创建 Builder对象,并且成功调用,
你也可以自己指定。['builder'=>$query] ,其中 数组的键名就是形参名字,值就是要给定的值。

app()->call([Document::class,'esCanShowQuery'])

// or

app()->call([Document::class,'esCanShowQuery'],['builder'=>$query])

// 如果是非静态方法,需要先实例化,静态方法直接传递类名

你没看到,不代表没传。依赖注入说白了就是容器类帮你实例化并传了值,不是没有传。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题