依賴注入之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
}
}