蛋定龙 2016-06-18 14:59:33 5391次浏览 1条回复 14 4 0

详细视频:点击查看

系列视频列表:点击查看

流程图:输入图片说明

Yii2容器3种类型的依赖注入 构造方法注入 在参数类型提示的帮助下,DI 容器实现了构造方法注入。当容器被用于创建一个新对象时,类型提示会告诉它要依赖什么类或接口。容器会尝试获取它所依赖的类或接口的实例,然后通过构造器将其注入新的对象。 Setter 和属性注入 Setter 和属性注入是通过配置提供支持的。当注册一个依赖或创建一个新对象时,你可以提供一个配置,该配置会提供给容器用于通过相应的 Setter 或属性注入依赖。 PHP 回调注入 这种情况下,容器将使用一个注册过的 PHP 回调创建一个类的新实例。回调负责解决依赖并将其恰当地注入新创建的对象。

构造方法注入
例子1.
public function actionConstructdi(){
   $container=new Container();
   $container->set('userFinder', 'dandinglong\containertest\UserFinder');
   $aaa=$container->get('userFinder');
   var_dump($aaa);
}

组件类
namespace dandinglong\containertest;
use yii\db\Connection;

class UserFinder
{
   public $db;

   public function __construct(Connection $db)
   {
       $this->db = $db;
   }

   public function findUser()
   {
   }
}



例子2.
public function actionConstructdi2(){
   $container=new Container();
   $container->set('yii\db\Connection', [
       'class' => 'yii\db\Connection',
       'dsn' => 'mysql:host=127.0.0.1;dbname=demo',
       'username' => 'root',
       'password' => '',
       'charset' => 'utf8',
   ]);
   $container->set('userFinder', 'dandinglong\containertest\UserFinder');
   $aaa=$container->get('userFinder');
   var_dump($aaa);
}
属性注入例子
public function actionSetterdi(){
   $container=new Container();
   $container->set('db', [
       'class' => 'yii\db\Connection',
       'dsn' => 'mysql:host=127.0.0.1;dbname=demo',
       'username' => 'root',
       'password' => '',
       'charset' => 'utf8',
   ]);
   $aaa=$container->get('db');
   var_dump($aaa);
}


Setter注入例子
public function actionSetterdi2(){
   $container=new Container();
   $aaa=$container->get('dandinglong\containertest\Foo',[],[
       'bar'=>$container->get('dandinglong\containertest\Bar')
   ]);
   var_dump($aaa);
}
组件类
namespace dandinglong\containertest;
use yii\base\Object;

class Foo extends Object
{
   private $bar;

   public function getBar()
   {
       return $this->_qux;
   }

   public function setbar($bar)
   {
       $this->bar = $bar;
   }
}


namespace dandinglong\containertest;

class Bar{

}
PHP 回调注入
public function actionCallbackdi(){
   $container=new Container();
   $container->set('Foo', function ($container,$params,$config) {
       echo "<pre>";
       print_r($params);
       print_r($config);
       $obj=new Foo();
       $obj->Bar=$container->get('dandinglong\containertest\Bar');
       return $obj;
   });
   $aaa=$container->get('Foo',['param1'=>1],['config1'=>1]);
   var_dump($aaa);
}
觉得很赞
您需要登录后才可以回复。登录 | 立即注册