我在Laravel框架中有一个例子。
class UserController extends Controller
{
public function store(Request $request)
{
$name = $request->input("name");
}
}
我不明白的是,store()
的功能签名中明确定义了请求。
无法通过php的类型推断找出传递给函数的内容吗?
这甚至会被视为依赖注入吗?
答案 0 :(得分:2)
这是方法级依赖注入。 Request
方法被传递到store
方法,而不是store
方法,知道如何创建Request
对象。
方法签名中的类型提示有两件事。
首先,对于普通的PHP,它强制执行传递给store
方法的参数必须是Request
对象或继承自Request
的对象这一事实。如果您尝试使用store()
对象(或后代)以外的任何方法调用Request
方法,则会出现错误。
由于这种严格的类型强制执行,我们知道$request
参数必须是Request
对象(或后代),我们可以依赖它的公共接口可供使用(你知道将存在input()
方法。
其次,对于Laravel,它告诉Laravel容器此方法需要什么类型的对象,以便可以从容器中解析出正确的对象并将其传递给方法。 Laravel的控制器方法是通过容器调用的,它允许自动依赖解析方法调用。
如果要删除类型提示,则会导致两个问题。在抽象级别,它允许您将任何类型的对象,甚至标量值传递给store()
方法。如果您尝试在字符串上调用input()
,则会遇到问题。在更具体的层面上,这将打破Laravel对控制器方法的自动依赖性解析。没有类型提示,Laravel无法知道方法需要什么对象,所以它不会传递任何东西,所以实际上你会收到一个错误,说你不能在{{1}上调用input()
(或者说存储方法需要一个参数的错误;不确定,没有测试)。