stuartwakefield / platter
轻量级依赖注入
v0.1.1-alpha
2014-08-20 18:58 UTC
Requires
- php: >=5.3.0
Requires (Dev)
- phpunit/phpunit: ~4.1
This package is not auto-updated.
Last update: 2024-09-24 02:37:08 UTC
README
轻量级依赖注入。
使用方法
要安装,请将其添加到您的 composer.json 中
"require": { "stuartwakefield/platter": "0.1.0" }
在您运行 composer install 之后,您将能够使用 Platter DI 管理器。
使用您的定义创建一个新的 Platter 实例
$factory = new Platter(array( 'dbuser' => 'admin', 'dbpassword' => 'password', 'dbname' => 'test', 'dbhost' => '0.0.0.0', 'connectionstring' => function ($container) { return "mysql:dbname={$container->get('dbname')};host={$container->get('dbhost')}"; }, 'pdo' => function ($container) { return new PDO( $container->get('connectionstring'), $container->get('dbuser'), $container->get('dbpassword') ); }, 'repository' => function ($container) { return new Repository($container->get('pdo')); } ));
要从容器中检索对象,只需使用 get 方法
$repository = $factory->get('repository');
您还可以将 Platter 容器链接在一起,一个容器被视为子容器,另一个容器被视为父容器。
$parent = new Platter(array( 'dbuser' => 'xyz', 'dbpassword' => 'abc' )); $factory = new Platter(array( 'DataSource' => function ($container) { return new DataSource( $container->get('dbuser'), $container->get('dbpassword') ); } ), $parent); $ds = $factory->get('DataSource');
在解决依赖关系时,如果子容器没有该依赖项的定义,则依赖项将从父容器中获取。
注意: 依赖项的解决方向是单向的,父容器不会检查其子容器以获取依赖项。因此,附加到容器的定义只能访问该容器及其父容器中的其他定义,但不能访问其子容器中的定义。
以下将不起作用
$parent = new Platter(array( 'DataSource' => function ($container) { return new DataSource( $container->get('dbuser'), $container->get('dbpassword') ); } )); $factory = new Platter(array( 'dbuser' => 'xyz', 'dbpassword' => 'abc' ), $parent); $ds = $factory->get('DataSource'); // "Identifier 'dbuser' is not defined"
如果不理解,这可能会导致混淆
$parent = new Platter(array( 'name' => 'Joe', 'example' => function ($container) { return $container->get('name'); } )); $factory = new Platter(array( 'name' => 'Michael' ), $parent); echo $factory->get('name'); // "Michael" echo $factory->get('example'); // "Joe"
example 定义无法访问子容器中的 name 定义,因此将返回父容器中的 name 定义。
构建器接口
Platter 还提供了一个构建器接口,用于使用友好且表达式的构建器接口注册项目。构建后,Platter 是不可变的。
$builder = new Platter\Builder; $parent = $builder ->register('dbuser', 'xyz') ->register('dbpassword', 'abc') ->build(); $builder = new Platter\Builder; $factory = $builder ->register('DataSource', function ($container) { return new DataSource( $container->get('dbuser'), $container->get('dbpassword') ); }) ->connect($parent) ->build();
要显示 Platter 服务的所有可用项目
$factory->available(); // array('DataSource', 'dbpassword', 'dbuser');
要显示 Platter 实例本身定义的项目
$factory->defined(); // array('DataSource');
要创建单例,请使用 Singleton 定义对象
$builder ->register('DataSource', new Platter\Definition\Singleton(function ($container) { return new DataSource( $container->get('dbuser'), $container->get('dbpassword') ); })) ->build();