terrydjony / ion
Ion 是一个使用自动依赖注入的最简 inversion of control 容器
Requires
- php: >=5.3.0
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 实例自动创建。