laravel 服務(wù)容器bind與上下文綁定的一個應(yīng)用實例

laravel 服務(wù)容器是一個用于管理類的依賴和執(zhí)行依賴注入的強大工具。其實就是一個超強IoCDI工具。
下面是laravel服務(wù)容器的一個bind上下文綁定的實現(xiàn)。

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 來實現(xiàn)DI(注入)
    public function test1()
    {
        // 獲取容器
        $container = Container::getInstance();
        // 給IUser接口綁定Man實例,只要后面有DI(注入)IUser對象的,IoC會自動創(chuàng)建Man實例
        $container->bind(IUser::class, Man::class);
        // 創(chuàng)建UserDao實例,會自動注入Man對象
        $instance = $container->make(UserDao::class);
        // $instance = app(UserDao::class); // 用app創(chuàng)建也行
        $instance->Add(); //調(diào)用Man類中的Model實例
    }

    // 綁定上下文 來實現(xiàn)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);
        }
        // 在代碼中要創(chuàng)建UserDao時直接 app(UserDao::class) 就行*/
        
        // 創(chuàng)建UserDao實例,會自動注入Man對象
        $instance = $container->make(UserDao::class);
        // $instance = app(UserDao::class); // 用app創(chuàng)建也行
        $instance->Add(); //調(diào)用Man類中的Model實例
    }
}

什么是IoC、DI這里不做詳解這篇文章講的很清楚

IoC的一個圖片,借鑒別的IOC/DI的理解
IoC容器
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容