威尼斯888_www.wns888.com_威尼斯wns888官网
做最好的网站
威尼斯888 > 计算机网络 / 编程 > 代码自动查找关系依赖自动注入

原标题:代码自动查找关系依赖自动注入

浏览次数:196 时间:2020-04-22

laravel容器包蕴调整反转和依靠注入,使用起来就是,先把对象bind好,须求时得以一向接纳make来取就好。

$config = $container->make;$connection = new Connection;

相比好精晓,那样的益处就是不用直接 new 贰个实例了,方法传值没啥改造,还足以多处共享此实例。

但那跟信任注入有啥关联,真正的依赖注入是不需给艺术传递任何参数值,只须求指明方法参数类型,代码自动物检疫索关系依赖自动注入。

那些特点在 laravel 的 Controller、Job 等处能够反映,如下:

class TestController extends Controller{public function anyConsole(Request $request, Auth $input){//todo}}

大家来看下他是怎么落到实处机关信赖注入的:

由 index.php 调用 Kernel ,经过多层 Kernel 管道调用,再到 Router ,经过多层中间件管道调用。最后一定到

Illuminate/Routing/Route.php 第124行。

public function run{$this->container = $this->container ?: new Container;try {if (! is_string($this->action['uses'])) {return $this->runCallable;}if ($this->customDispatcherIsBound {return $this->runWithCustomDispatcher;}return $this->runController;} catch (HttpResponseException $e) {return $e->getResponse();}}

判断 $this->action['uses'](格式行如:AppHttpControllerDatacenterRealTimeController@anyConsole)是不是字符串, $this->customDispatcherIsBound决断是还是不是绑定了用户自定义路由。然后跳转到 $this->runController。

protected function runController{list = explode('@', $this->action['uses']);$parameters = $this->resolveClassMethodDependencies($this->parametersWithoutNulls;if (! method_exists($instance = $this->container->make {throw new NotFoundHttpException;}return call_user_func_array([$instance, $method], $parameters);}

$this->resolveClassMethodDependencies 那几个方式一看名字就精通是大家要找的艺术。$this->parametersWithoutNulls(卡塔尔国是过滤空字符,$class、$method分别行如:AppHttpControllerDatacenterRealTimeController 与 anyConsole。

protected function resolveClassMethodDependencies(array $parameters, $instance, $method){if (! method_exists {return $parameters;}return $this->resolveMethodDependencies($parameters, new ReflectionMethod;}

new ReflectionMethod 是取得类措施的反射对象,参见文书档案:

上边跳转到Illuminate/Routing/RouteDependencyResolverTrait.php 第54行。

public function resolveMethodDependencies(array $parameters, ReflectionFunctionAbstract $reflector){$originalParameters = $parameters;foreach ($reflector->getParameters() as $key => $parameter) {$instance = $this->transformDependency($parameter, $parameters, $originalParameters);if  {$this->spliceIntoParameters($parameters, $key, $instance);}}return $parameters;}

经过反射类方法获得类参数数组,然后遍历传递给 $this->transformDependency 方法。倘使实例获取不到则调用 $this->spliceIntoParameters 清楚该参数。

protected function transformDependency(ReflectionParameter $parameter, $parameters, $originalParameters){$class = $parameter->getClass();if ($class && ! $this->alreadyInParameters($class->name, $parameters)) {return $this->container->make;}}

好不轻巧看出了容器的阴影,没有错最后指标照旧通过容器的 make 方法收取来的。至此参数就协会好了,然后最后会被 runController 方法的 call_user_func_array 回调。

总结:

1. 正视注入原理其实正是选拔类措施反射,取得参数类型,然后选择容器布局好实例。然后再使用回调函数调起。

  1. 流入对象布局函数无法有参数。不然会报错。Missing argument 1

  2. 正视注入故然好,但它应当要由 Router 类调起,不然直接用 new格局是心余力绌兑现注入的。所以那就怎么独有 Controller 、Job 类技艺用那几个特点了。

如上正是关于php+laravel信任注入的万事知识点内容,谢谢大家的求学和对剧本之家的支撑。

本文由威尼斯888发布于计算机网络 / 编程,转载请注明出处:代码自动查找关系依赖自动注入

关键词:

上一篇:网站目的是获取改用户微信的账户

下一篇:这里可以下到中文手册