美文网首页
laravel 服务容器bind与上下文绑定的一个应用实例

laravel 服务容器bind与上下文绑定的一个应用实例

作者: _老七 | 来源:发表于2020-03-01 22:50 被阅读0次

    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容器

    相关文章

      网友评论

          本文标题:laravel 服务容器bind与上下文绑定的一个应用实例

          本文链接:https://www.haomeiwen.com/subject/cpxlkhtx.html