laravel 服務容器bind與上下文綁定的一個應用實例

laravel 服務容器是一個用於管理類的依賴和執行依賴注入的強大工具。其實就是一個超強IoCDI工具。
下面是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這裏不做詳解這篇文章講的很清楚

IoC的一個圖片,借鑑別的IOC/DI的理解

IoC容器

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章