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