首先要明白 function (Service $service)
的写法原本是类型提示,和 (int $a)
没有区别,只起到类型约束的作用,也就是只检查传入的变量是否是 Service 的实例,还需要你手动传参。
而 laravel 能办到把类型提示实例化后帮你传参,这就是所谓的 ⌈注入⌋,怎么办到的见文章 博客:laravel6 Util::getParameterClassName 获得类方法参数类型的类名源...
原理是利用反射,类方法用的是 ReflectionMethod
,函数用的是 ReflectionFunction
,没那么复杂,简单说就是它帮你办了。
但类型提示如果是抽象的 interface
abstract
,这些没办法实例化,那 laravel 也可以将抽象的类型提示实例化,就需要利用到容器的绑定了,将抽象绑定实有
$app->bind(ExampleInterface::class, ExampleClass::class)
文档中的例子就是简单的实例化类型提示,无需容器绑定,所以叫 ⌈零配置⌋
<?php
class Service{}
Route::get('/', function (Service $service) {
die(get_class($service));
});
看源码中 Route::get
中怎么做的,在 Route::run
方法中调用闭包
零配置,第一次听说,太久没看文档了,产生了新专业词。
所谓零配置: …
比如控制器自动注入某个类,这就是 零配置
了,说白了 就是自动注入的类是不是抽象的类。
public function update(UserService userService){ // UserService是个具体类
}
app()->bind(UserInter::class,UserService::class);
public function update(UserInter UserInter){ // 难道不能自动解析UserInter吗? 要app(UserInter::class)???
}
我也有点懵,不管所谓的专业词的,根据自己需求用。
首先要明白 function (Service $service)
的写法原本是类型提示,和 (int $a)
没有区别,只起到类型约束的作用,也就是只检查传入的变量是否是 Service 的实例,还需要你手动传参。
而 laravel 能办到把类型提示实例化后帮你传参,这就是所谓的 ⌈注入⌋,怎么办到的见文章 博客:laravel6 Util::getParameterClassName 获得类方法参数类型的类名源...
原理是利用反射,类方法用的是 ReflectionMethod
,函数用的是 ReflectionFunction
,没那么复杂,简单说就是它帮你办了。
但类型提示如果是抽象的 interface
abstract
,这些没办法实例化,那 laravel 也可以将抽象的类型提示实例化,就需要利用到容器的绑定了,将抽象绑定实有
$app->bind(ExampleInterface::class, ExampleClass::class)
文档中的例子就是简单的实例化类型提示,无需容器绑定,所以叫 ⌈零配置⌋
<?php
class Service{}
Route::get('/', function (Service $service) {
die(get_class($service));
});
看源码中 Route::get
中怎么做的,在 Route::run
方法中调用闭包
推荐文章: