laravel Ioc Container (ServiceProvider服务容器)的魔力之一:automatic dependency resolution

本文来自pilishen.com----原文连接; 欢迎做客咱们的php&Laravel学习群:109256050php

该篇属于《Laravel底层核心技术实战揭秘》这一课程《laravel底层核心概念解析》这一章的扩展阅读。因为要真正学好laravel底层,有些PHP相关的知识必须得了解,考虑到学员们的基础差别,为了不视频当中过于详细而连篇累牍,故将一些laravel底层实现相关的PHP知识点以文章形式呈现,供你们预习和随时查阅。laravel

在laravel的routes.php或者web.php里以下测试:web

class Bar {}

Route::get('/test', function(Bar $bar){
	dd($bar);
});
复制代码

以前的文章里,咱们知道,要往一个函数或方法里传参,尤为是传class的实例化对象,那么以前你必须得有个实例,说白了就是得new一下,可是上面的代码没瞅见有传参过程,只是这个route的回调函数里指望传入一个Class Bar的实例$bar,没有实例化过程,这能行吗?bash

Bar {#250}
复制代码

咦?竟然能够!框架

好,既然你能够,先无论别的,我再给你整的复杂些:ide

class Baz {}

class Bar {
	
	protected $baz;
	public function __construct(Baz $baz)
	{
		$this->baz = $baz;
	}
}

Route::get('/test', function(Bar $bar){
	dd($bar);
});
复制代码

看你此次还行?函数

Bar {#253 ▼
  #baz: Baz {#255}
}
复制代码

呀!厉害了——我可没有给你传new Bar(new Baz)进去啊!post

也便是说,不管是在route回调函数里,仍是在controller里,仍是其余相关地方,laravel的IoC Container能自动进行依赖解析、注入,像上面的例子,它能知道咱们指望传入一个Class Bar的实例$bar,而后自动背后给咱们建立了一个,同时,它也能知道Class Bar的constructor中须要传入一个Class Baz实例,也进一步给咱们建立了。因此,这整个过程当中,咱们不须要去手动new学习

可能,以前你有本身查看过laravel的源码,在层层依赖的状况下,你会发现明明其间不少class都有constructor,都须要传入dependency,可是laravel在调用的过程当中,啥也没给传,按照以前的思路,这根本行不通嘛~测试

那么如今,我们知道laravel的Container能自动解析依赖(automatic dependency resolution),虽然如今还不清楚它背后具体怎么实现,至少不影响继续往下看源码了。

至于具体是怎么实现的,以及我们可否本身写一个这样的功能,而后用在本身的框架里,这些咱们在《Laravel底层核心技术实战揭秘》相应章节具体呈现~

相关文章
相关标签/搜索