yiisoft / definitions
该软件包提供定义语法
Requires
- php: ^8.0
- psr/container: ^1.0|^2.0
Requires (Dev)
- maglnet/composer-require-checker: ^4.2
- phpunit/phpunit: ^9.5
- rector/rector: ^1.0.0
- roave/infection-static-analysis-plugin: ^1.18
- spatie/phpunit-watcher: ^1.23
- vimeo/psalm: ^4.30|^5.21
- yiisoft/test-support: ^1.4
This package is auto-updated.
Last update: 2024-09-18 14:44:29 UTC
README
Yii 定义
该软件包提供用于创建和配置服务或对象的语法构造。它被 yiisoft/di 和 yiisoft/factory 使用,但也可以用于其他兼容 PSR-11 的软件包。
以下提供的内容
- 描述要创建或对象的定义。这包括语法、验证以及将其解析为对象。
- 指向其他定义的引用和动态引用。这些包括同时引用多个定义的附加实用程序。
需求
- PHP 8.0 或更高版本。
安装
可以使用 Composer 安装此软件包
composer require yiisoft/definitions
一般使用
定义
定义描述创建和配置服务、对象或返回任何其他值的方式。它必须实现 Yiisoft\Definitions\Contract\DefinitionInterface
,该接口具有一个方法 resolve(ContainerInterface $container)
。引用通常存储在容器或工厂中,并在获取服务实例或创建对象时解析为对象。
ArrayDefinition
数组定义允许声明性地描述服务或对象
use \Yiisoft\Definitions\ArrayDefinition; $definition = ArrayDefinition::fromConfig([ 'class' => MyServiceInterface::class, '__construct()' => [42], '$propertyName' => 'value', 'setName()' => ['Alex'], ]); $object = $definition->resolve($container);
在上面的代码中
class
包含要实例化的类的名称。__construct()
包含构造函数参数的数组。- 配置的其余部分是属性值(以
$
为前缀)和方法调用,以()
结尾。它们按照在数组中出现的顺序设置/调用。
对于多个方法调用,后缀键使用唯一的字符串,例如
[ 'class' => Collector::class, 'add()' => ['Alex'], 'add()2' => ['Mike'], ]
CallableDefinition
可调用定义通过执行可调用并根据其签名中使用的类型注入依赖项来构建对象
use \Yiisoft\Definitions\CallableDefinition; $definition = new CallableDefinition( fn (SomeFactory $factory) => $factory->create('args') ); $object = $definition->resolve($container); // or $definition = new CallableDefinition( fn () => MyFactory::create('args') ); $object = $definition->resolve($container); // or $definition = new CallableDefinition( [MyFactory::class, 'create'] ); $object = $definition->resolve($container);
在上面的代码中,我们使用闭包、静态调用和作为数组调用的静态方法。在每种情况下,我们根据可调用签名中参数的类型确定和传递依赖项。
ParameterDefinition
参数定义根据从 ReflectionParameter
实例的信息解析对象
use \Yiisoft\Definitions\ParameterDefinition; $definition = new ParameterDefinition($reflectionParameter); $object = $definition->resolve($container);
它主要用于处理可调用时的内部操作。
ValueDefinition
值定义直接解析传递的值
use \Yiisoft\Definitions\ValueDefinition; $definition = new ValueDefinition(42, 'int'); $value = $definition->resolve($container); // 42
引用
引用指向其他定义,因此在定义定义时,可以使用其他定义作为其依赖项
[ InterfaceA::class => ConcreteA::class, 'alternativeForA' => ConcreteB::class, MyService::class => [ '__construct()' => [ Reference::to('alternativeForA'), ], ], ]
可选引用在没有对应定义在容器中时返回 null
[ MyService::class => [ '__construct()' => [ // If container doesn't have definition for `EventDispatcherInterface` reference returns `null` // when resolving dependencies Reference::optional(EventDispatcherInterface::class), ], ], ]
DynamicReference
定义对容器中未定义的服务的依赖
[ MyService::class => [ '__construct()' => [ DynamicReference::to([ 'class' => SomeClass::class, '$someProp' => 15 ]) ] ] ]
为了将 ID 数组作为引用传递给属性或参数,可以使用 Yiisoft\Definitions\ReferencesArray
或 Yiisoft\Definitions\DynamicReferencesArray
//params.php return [ 'yiisoft/data-response' => [ 'contentFormatters' => [ 'text/html' => HtmlDataResponseFormatter::class, 'application/xml' => XmlDataResponseFormatter::class, 'application/json' => JsonDataResponseFormatter::class, ], ], ]; //web.php ContentNegotiator::class => [ '__construct()' => [ 'contentFormatters' => ReferencesArray::from($params['yiisoft/data-response']['contentFormatters']), ], ],
定义存储
定义存储可用于存储和检索定义以及检查是否可以实例化特定定义。通常,它由使用定义的实现使用。
use Yiisoft\Definitions\DefinitionStorage; $storage = new DefinitionStorage([ MyInterface::class => MyClass::class, ]); $storage->setDelegateContainer($fallbackContainer); if (!$storage->has(MyInterface::class)) { $buildStack = $storage->getBuildStack(); // ... }
在上面的代码中,$buildStack
将包含一个包含定义 ID 的堆栈,这些 ID 的顺序是最新依赖项获得的顺序。
默认情况下,如果一个类在has()
中被检查,但没有明确定义,存储将首先尝试自动加载它,然后失败。存储也可以在严格模式下工作,其中其中所有内容都必须明确定义。
use Yiisoft\Definitions\DefinitionStorage; $storage = new DefinitionStorage([], true); var_dump($storage->has(EngineMarkOne::class));
has()
即使在EngineMarkOne
存在的情况下也会返回false
。
文档
如果您需要帮助或有问题,Yii 论坛是一个很好的地方。您还可以查看其他Yii 社区资源。
许可证
Yii 定义是免费软件。它根据BSD许可证发布。有关更多信息,请参阅LICENSE
。
由Yii 软件维护。