yiisoft/definitions

该软件包提供定义语法

3.3.0 2024-03-16 13:31 UTC

README

Yii

Yii 定义


Latest Stable Version Total Downloads Build status Code Coverage Mutation testing badge static analysis type-coverage

该软件包提供用于创建和配置服务或对象的语法构造。它被 yiisoft/diyiisoft/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\ReferencesArrayYiisoft\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 软件维护。

支持项目

Open Collective

关注更新

Official website Twitter Telegram Facebook Slack