Yii依赖之容器

依赖注入之container - 定义并解决依赖关系

namespace app\controllers;
use yii\web\Controller;
use yii\di\Container;//容器类
class TestController extends Controller{
    public function actionTest(){
        //定义一个容器
        $container = new Container();
        //生成依赖对象 当一个类依赖这个接口时相应的类会被初始化作为依赖对象(参数二)
        $container->set('app\controllers\Driver', 'app\controllers\ManDriver');
        $car = $container->get('app\controllers\Car');

        $car->run(); //I am an old man
    }
}
//司机接口
interface Driver{
    public function say();
}
//司机
class ManDriver implements Driver{
    public function say(){
        echo "I am an old man";
    }
}

//汽车类
class Car {
    private $driver = null;
    //前提是container的实例 获取类实例的时候-
    //如果不存在参数的话会默认实例化类型限制的类 这里是ManDrive
    //如果其是一个接口的话 可以使用container的set方法指定
    public function __construct(Driver $driver)
    {
        $this->driver = $driver;
    }

    public function run(){
        $this->driver->say();
    }
}

依赖注入之serviceLocator 配置服务的参数

两种方式实现 容器自动解决依赖关系

class TestController extends Controller{
    public function actionTest(){
        //设置一个全局容器 当遇到Driver接口依赖时 就实例化ManDriver作为依赖对象
        \Yii::$container->set('app\controllers\Driver','app\controllers\ManDriver');
        //①局部方式
        $sl = new ServiceLocator();
        $sl->set('Car', [
            'class' => 'app\controllers\Car',
        ]);
        $car = $sl->get('Car');
        //②全局方式
        //把 'car' => ['class'=>'app\controllers\Car'];配置到应用配置中
        \Yii::$app->car->run();//把car定义为应用组件
        $car->run(); //I am an old man
    }
}

猜你喜欢

转载自blog.csdn.net/u012910292/article/details/58327712