mnapoli / assembly
互操作容器定义的实现
Requires
- php: >=5.4
- container-interop/container-interop: ~1.1
- container-interop/definition-interop: ~0.2.0
Requires (Dev)
- phpunit/phpunit: ~4.8
This package is auto-updated.
Last update: 2020-01-19 10:47:32 UTC
README
此仓库是实验性的
Assembly 为 definition-interop 定义以及兼容的容器提供了一个实现。
安装
composer require mnapoli/assembly@dev
使用
虽然您可以实现 Interop\Container\Definition\DefinitionProviderInterface
并返回一个手动构建的定义对象数组,但 Assembly 提供了一个更自然的 API 来更容易地创建定义。
要利用这一点,只需扩展 Assembly\ArrayDefinitionProvider
并填写 getArrayDefinitions
方法
class MyModuleDefinitionProvider extend \Assembly\ArrayDefinitionProvider { public function getArrayDefinitions() { return [ 'logger.destination' => '/var/log/myapp.log', 'logger' => \Assembly\object('MyLogger') ->setConstructorArguments('warning', \Assembly\get('logger.destination')) ->addMethodCall('setDebug', true), 'super_mailer' => \Assembly\factory('MailerFactory', 'create'), 'mailer' => \Assembly\get('super_mailer'), ]; } }
如果您使用的是 PHP 5.6 或更高版本,您可以导入命名空间函数
use function \Assembly\object; use function \Assembly\get; class MyModuleDefinitionProvider extend \Assembly\ArrayDefinitionProvider { public function getArrayDefinitions() { return [ 'logger' => object(MyLogger::class), 'logger_alias' => get('logger'), ]; } }
如果您不想编写新类,您也可以直接实例化一个新的提供者
$provider = new ArrayDefinitionProvider([ // add definitions here ]);
定义类
如果您不想使用函数助手,您也可以直接创建定义实例。
参数定义
return [ 'db.port' => new ParameterDefinition(3306), ];
此定义将定义一个容器条目 "db.port"
。这意味着 get('db.port')
将返回 3306
。
引用
return [ 'logger' => new Reference('monolog'), ];
此定义将别名 "logger" 条目到 "monolog"。这意味着 get('logger')
将返回 get('monolog')
的结果。
对象定义
$definition = new ObjectDefinition('PDO'); $definition->addConstructorArgument('mysql:host=localhost;dbname=test'); $definition->addConstructorArgument('user'); $definition->addConstructorArgument('password');
上面的定义将返回 new PDO('mysql:host=localhost;dbname=test', 'user', 'password')
的结果。
引用也可以使用
$definition = new ObjectDefinition('PDO'); $definition->addConstructorArgument(new Reference('db.connection_string')); $definition->addConstructorArgument('user'); $definition->addConstructorArgument('password');
上面的定义将返回 new PDO($container->get('db.connection_string'), 'user', 'password')
的结果。
工厂调用定义
下面的定义将调用 "db.factory" 容器条目的 create()
方法并返回其结果
$definition = new FactoryCallDefinition(new Reference('db.factory'), 'create'); $definition->setArguments(new Reference('db.connection_string'), 'user', 'password');
下面的定义将调用静态方法 Acme\DbFactory::create()
$definition = new FactoryCallDefinition('Acme\DbFactory', 'create');
容器
Assembly 附带了一个简单的与标准定义兼容的容器。该容器的目的是为希望使用定义的用户提供一种非常简单的方式来入门。
这是如何使用它的方法
// List the definition providers to load $definitionProviders = [ new Module1DefinitionProvider(), new Module2DefinitionProvider(), ]; // Define here container entries for the application $entries = [ 'abc' => 'def', 'router' => new Router(...), ]; $container = new Container($entries, $definitionProviders);
为了简化,容器是不可变的,其 API 非常有限。如果您不满意,鼓励您使用任何其他兼容的容器。
定义解析器
容器的 "定义解析器" 是在单独的 Assembly\Container\DefinitionResolver
类中编写的。此类旨在被任何希望支持 definition-interop 的其他容器重用。使用它非常简单
$resolver = new \Assembly\Container\DefinitionResolver($container); $value = $resolver->resolve($definition);