服务容器的零配置解决方案是如何实现的?

如果很复杂的话说个大概的流程就行了。

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

首先要明白 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 方法中调用闭包

file

8个月前 评论
讨论数量: 6
sanders

能请楼主解释一下什么叫“零配置解决方案”?

8个月前 评论
sanders (作者) 8个月前

零配置,第一次听说,太久没看文档了,产生了新专业词。

所谓零配置: …
比如控制器自动注入某个类,这就是 零配置了,说白了 就是自动注入的类是不是抽象的类。

public function update(UserService userService){ // UserService是个具体类
}


app()->bind(UserInter::class,UserService::class); 
public function update(UserInter UserInter){ // 难道不能自动解析UserInter吗? 要app(UserInter::class)???
}

我也有点懵,不管所谓的专业词的,根据自己需求用。

8个月前 评论

使用反射获取方法参数签名,根据参数签名的类型使用容器去获取绑定/解析依赖。

8个月前 评论

首先要明白 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 方法中调用闭包

file

8个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!