laravel 服务容器是一个用于管理类的依赖和执行依赖注入的强大工具。其实就是一个超强
IoC
与DI
工具。
下面是laravel服务容器的一个bind
与上下文绑定
的实现。
interface IUser
{
public function getModel();
}
class Model
{
public $name;
}
class Man implements IUser
{
private $model;
public function __construct(Model $model)
{
$model->name = "man";
$this->model = $model;
}
public function getModel()
{
return $this->model;
}
}
class Woman implements IUser
{
private $model;
public function __construct(Model $model)
{
$model->name = "woman";
$this->model = $model;
}
public function getModel()
{
return $this->model;
}
}
class UserDao
{
private $user;
public function __construct(IUser $user)
{
$this->user = $user;
}
public function Add()
{
$model = $this->user->getModel();
return $model;
}
}
// 测试方法
class Test
{
// bind 来实现DI(注入)
public function test1()
{
// 获取容器
$container = Container::getInstance();
// 给IUser接口绑定Man实例,只要后面有DI(注入)IUser对象的,IoC会自动创建Man实例
$container->bind(IUser::class, Man::class);
// 创建UserDao实例,会自动注入Man对象
$instance = $container->make(UserDao::class);
// $instance = app(UserDao::class); // 用app创建也行
$instance->Add(); //调用Man类中的Model实例
}
// 绑定上下文 来实现DI(注入)
public function test2()
{
// 获取容器
$container = Container::getInstance();
// 上下文绑定
$container->when(UserDao::class)->needs(IUser::class)->give(Man::class);
/*// 也可以在App\Providers\AppServiceProvider的register方法注册上下仍
public function register()
{
$this->app->when(UserDao::class)->needs(IUser::class)->give(Man::class);
}
// 在代码中要创建UserDao时直接 app(UserDao::class) 就行*/
// 创建UserDao实例,会自动注入Man对象
$instance = $container->make(UserDao::class);
// $instance = app(UserDao::class); // 用app创建也行
$instance->Add(); //调用Man类中的Model实例
}
}
什么是IoC、DI这里不做详解这篇文章讲的很清楚
网友评论