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這裏不做詳解這篇文章講的很清楚