📅  最后修改于: 2020-10-16 07:23:11             🧑  作者: Mango
DI(依赖注入)容器是知道如何实例化和配置对象的对象。 Yii通过yii \ di \ Container类提供DI容器。
它支持以下类型的DI-
DI容器借助类型提示支持构造函数注入-
class Object1 {
public function __construct(Object2 $object2) {
}
}
$object1 = $container->get('Object1');
// which is equivalent to the following:
$object2 = new Object2;
$object1 = new Object1($object2);
通过配置支持属性和二传手注入-
_var2;
}
public function setVar2(MyObject2 $var2) {
$this->_var2 = $var2;
}
}
$container->get('MyObject', [], [
'var1' => $container->get('MyOtherObject'),
'var2' => $container->get('MyObject2'),
]);
?>
在PHP可调用注入的情况下,容器将使用注册的PHP回调来构建类的新实例-
$container->set('Object1', function () {
$object1 = new Object1(new Object2);
return $object1;
});
$object1 = $container->get('Object1');
控制器动作注入是一种DI类型,其中使用类型提示声明依赖项。这对于使MVC控制器保持轻薄和纤薄非常有用-
public function actionSendToAdmin(EmailValidator $validator, $email) {
if ($validator->validate($email)) {
// sending email
}
}
您可以使用yii \ db \ Container :: set()方法注册依赖项-
set('yii\db\Connection');
// register an alias name. You can use $container->get('MyObject')
// to create an instance of Connection
$container->set('MyObject', 'yii\db\Connection');
// register an interface
// When a class depends on the interface, the corresponding class
// will be instantiated as the dependent object
$container->set('yii\mail\MailInterface', 'yii\swiftmailer\Mailer');
// register an alias name with class configuration
// In this case, a "class" element is required to specify the class
$container->set('db', [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=127.0.0.1;dbname = helloworld',
'username' => 'vladimir',
'password' => '12345',
'charset' => 'utf8',
]);
// register a class with configuration. The configuration
// will be applied when the class is instantiated by get()
$container->set('yii\db\Connection', [
'dsn' => 'mysql:host=127.0.0.1;dbname = helloworld',
'username' => 'vladimir',
'password' => '12345',
'charset' => 'utf8',
]);
// register a PHP callable
// The callable will be executed each time when $container->get('db') is called
$container->set('db', function ($container, $params, $config) {
return new \yii\db\Connection($config);
});
// register a component instance
// $container->get('pageCache') will return the same instance each time when it
//is called
$container->set('pageCache', new FileCache);
?>
步骤1-在components文件夹内,使用以下代码创建一个名为MyInterface.php的文件。
步骤2-在components文件夹内,创建两个文件。
First.php-
";
}
}
?>
Second.php-
";
}
}
?>
步骤3-现在,将actionTestInterface添加到SiteController。
public function actionTestInterface() {
$container = new \yii\di\Container();
$container->set
("\app\components\MyInterface","\app\components\First");
$obj = $container->get("\app\components\MyInterface");
$obj->test(); // print "First class"
$container->set
("\app\components\MyInterface","\app\components\Second");
$obj = $container->get("\app\components\MyInterface");
$obj->test(); // print "Second class"
}
步骤4-转到http:// localhost:8080 / index.php?r = site / test-interface,您应该看到以下内容。
这种方法很方便,因为我们可以在一个地方设置类,而其他代码将自动使用新类。