Laravel Service Container 类的依赖管理和依赖注入
优点:
很好的管理类与类之间的依赖管理
使用简单
流程:
1、在创建Family前先将相关的依赖Head、Person、Tv先进行了注入和管理,最后在才进行Family的实例化
2、流程Head-》Person、Tv-》Family
Route::get('/', function (Family $family) {
});
class Head
{
public function __construct()
{
echo "Head created <br/>";
}
}
class Person
{
public $head;
public function __construct(Head $head)
{
$this->head = $head;
echo "Person created <br/>";
}
}
class Tv
{
public function __construct()
{
echo "Tv created <br/>";
}
}
class Family
{
public $person;
public $tv;
function __construct(Person $person, Tv $tv)
{
$this->person = $person;
$this->tv = $tv;
echo "family created <br/>";
}
}
Service Container Binding - 如何绑定类和服务
实现类与类之间的绑定关系,可以通过单例优化
Route::get('/', function (Family $family) {
});
class Head
{
public function __construct()
{
echo "Head created <br/>";
}
}
class Person
{
public $head;
public function __construct(Head $head)
{
$this->head = $head;
echo "Person created <br/>";
}
}
class Tv
{
public function __construct()
{
echo "Tv created <br/>";
}
}
class Family
{
public $person;
public $tv;
function __construct($person, $tv)
{
$this->person = $person;
$this->tv = $tv;
echo "family created <br/>";
}
}
//绑定类与类之间的依赖关系
\Illuminate\Support\Facades\App::bind('Family',function (){
echo 'family binding <br/>';
//手动实现类与类之间的绑定关系
return new Family(new Person(new Head()),new Tv());
});
Service Container 不使用依赖注入如何解析对象或服务
app(‘Family’)
Route::get('/', function () {
dd(app('Family'));
});
class Head
{
public function __construct()
{
echo "Head created <br/>";
}
}
class Person
{
public $head;
public function __construct(Head $head)
{
$this->head = $head;
echo "Person created <br/>";
}
}
class Tv
{
public function __construct()
{
echo "Tv created <br/>";
}
}
class Family
{
public $person;
public $tv;
function __construct($person, $tv)
{
$this->person = $person;
$this->tv = $tv;
echo "family created <br/>";
}
}
//绑定类与类之间的依赖关系
\Illuminate\Support\Facades\App::bind('Family',function (){
echo 'family binding <br/>';
//手动实现类与类之间的绑定关系
return new Family(new Person(new Head()),new Tv());
});