Ion 是一个使用自动依赖注入的最简 inversion of control 容器

v1.0 2017-03-26 16:24 UTC

This package is not auto-updated.

Last update: 2024-09-24 04:25:16 UTC


README

使用自动依赖注入的最简 inversion of control 容器

安装

要安装 ION 容器,您需要将其添加到您的 composer.json 文件中

{
      "require": "terrydjony/ion"
}

或者,通过使用终端

composer require terrydjony/ion

使用方法

首先,您需要实例化容器

use Ion\Container;

$ion = new Container();

实例化对象

要实例化任何对象,您应该使用 make($class, array $args = array()),而不是 new 关键字

注意第二个参数 $args 是可选的。例如,如果您想实例化 stdClass 类。

$stdClass = $ion->make('stdClass');

// $stdClass is an instance of stdClass

注册服务

您可以通过 register($key, $closure) 注册一些类的实例化方式。以下是一个将 PDO 类与一些定义好的参数注册的示例

$ion->register('PDO', function() {
    return new PDO('mysql:host=localhost;dbname=databasename','root','');
};

$pdo = $ion->make('PDO');

// $pdo is an instance of PDO class with the arguments as defined before

上面的示例将注册 PDO 服务。因此,如果您通过 $ion->make('PDO') 实例化它,您不需要提供任何参数,因为所有参数都已预先定义。

但是,有一个数据库配置会更好。

$config = array('dsn'=>'mysql:host=localhost;dbname=databasename','username'=>'root','password'=>'');

$ion->register('PDO', function() use ($config) {
    return new PDO($config['dsn'],$config['username'],$username['password']);
});

$pdo = $ion->make('PDO');
And, notice that the first parameter of register is a key. The key can be anything, but it's recommended to use the class name as the key.

$ion->register('DAL', function() {
    return new PDO($config['dsn'],$config['username'],$config['password']);
};

$dal = $ion->make('DAL');
// $dal is a PDO object

注意,如果您注册了一个服务,它将是一个共享实例。如果您想注册一个工厂,请使用 registerFactory

注册工厂服务

您可以使用 registerFactory($key, $closure) 注册一个工厂

$ion->registerFactory('CarFactory', function() {
    return new Car();
};

$car1 = $ion->make('CarFactory');
$car2 = $ion->make('CarFactory');

// $car1 and $car2 are different objects
If you want to use the supplied arguments, you can use getArgs() method.

$this->ion->registerFactory('User', function($ion) {
  return new User($ion->getArgs());
});

$user1 = $this->ion->make('User',array('Foo'));
// $user1 is an instance with argument Foo

注册参数

您还可以使用 setParam($param, $value) 注册参数,并通过 param($param_name) 获取值

$ion->setParam('db_dsn','mysql:host=localhost;dbname=databasename');
$ion->setParam('db_user','root');
$ion->setParam('db_password','');

$ion->register('PDO', function($ion) {
    return new PDO($ion->param('db_dsn'), $ion->param('db_user'), $ion->param('db_pass');
}

强制新实例

您可以使用 makeNew($key, $args=array()) 强制创建新实例。

// register a PDO service before

$pdo1 = $ion->makeNew('PDO');
$pdo2 = $ion->makeNew('PDO');

// $pdo1 and $pdo2 are different objects no matter how the PDO service is registered 

为接口定义默认类

您可以将接口绑定到一个类上。所以,如果一个类依赖于该接口,那个类将代表该接口

如果类必须用一些参数来实例化,您应该先注册它。然后,将键作为 bindInterface 的第二个参数给出

但是,如果类可以用无参数的方式实例化,您只需指定类名即可。

class A
{
    public function __construct(DatabaseAdapterInterface $dba, StandardClassInterface $stdClass, StandardInterface $obj)
    {

    }
}

$ion->register('PDO', function() {
    return new PDO('mysql:host=localhost;dbname=databasename','root','');
}

// Binds DatabaseAdapterInterface to PDO class which has been registered
$ion->bindInterface('DatabaseAdapterInterface', 'PDO');

// Binds StandardClassInterface to stdClass which needs no arguments for construction
$ion->bindInterface('StandardClassInterface', 'stdClass');

$a = $ion->make('A');

自动依赖注入

假设您想实例化一个类 A,它需要类 B,而类 B 需要类 C

我的意思是像这样

class A
{
  public function __construct(B $b)
  {

  }
}

class B
{
  public function __construct(C $c)
  {

  }
}

class C
{
  public function __construct()
  {
    
  }
}

要创建一个类 A 实例,您只需这样做

$a = $ion->make('A');

哇!您得到了类 A 实例!

如果您有一个需要一些参数的依赖,您可以在创建需要该依赖的对象之前先注册该依赖

如果类需要一些参数,您可以将参数数组作为 make 或 makeNew 方法的第二个参数提供。

class A
{
    public function __construct(B $b, $name)
    {
        echo "Hello ".$name
    }
}

class B
{
    public function __construct(DatabaseAdapterInterface $dba)
    {

    }
}


$ion->register('PDO', function() {
    return new PDO('mysql:host=localhost;dbname=databasename','root','');
});
$ion->bindInterface('DatabaseAdapterInterface','PDO');

$a = $ion->make('A',array('World'));

类 A 实例自动创建。