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