您的位置:一分快三全天精准计划 > 1分快3全天计划官方网站-编程 > 代码自动查找关系依赖自动注入

代码自动查找关系依赖自动注入

2020-04-04 12:55

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看重注入的漫天知识点内容,感激大家的上学和对台本之家的支撑。

本文由一分快三全天精准计划发布于1分快3全天计划官方网站-编程,转载请注明出处:代码自动查找关系依赖自动注入

关键词: