makinacorpus/argument-resolver

回调参数解析器接口和实现。

1.0.7 2023-05-16 13:06 UTC

This package is auto-updated.

Last update: 2024-09-08 15:44:06 UTC


README

提供回调参数解析器接口和实现,与symfony/http-kernelArgumentResolver类实现非常相似,但可用于Symfony项目以外的HTTP环境。

此API不依赖于任何其他组件,并从Symfony组件中复制粘贴了一些代码

  • 做出这个选择是因为Symfony的代码将请求对象依赖项硬编码为其API的一部分,而我们需要在HTTP环境之外使用此API。
  • 这使得该组件能够长期抵抗Symfony代码的变化,并简化了维护工作。

1.0 路线图

  • API基础
  • makinacorpus/access-control检索功能
  • 基本Symfony捆绑包
  • 服务参数值解析器

入门指南

安装

使用Composer安装

composer require makinacorpus/argument-resolver

作为Symfony捆绑包设置

然后将其添加到您的config/bundles.php文件中

<?php

return [
    // ... Your other bundles.
    MakinaCorpus\ArgumentResolver\Bridge\Symfony\ArgumentResolverBundle::class => ['all' => true],
];

基本用法

考虑以下函数

namespace Some\Namespace;

function foo(int $bar, ?int $foo, string $fizz = 'foo', \DateTime ...$dates): void
{
    // Do something.
}

这将协调来自参数值解析器的参数

use MakinaCorpus\ArgumentResolver\Context\ArrayResolverContext;
use MakinaCorpus\ArgumentResolver\DefaultArgumentResolver;

$callback = '\\Some\\Namespace\\foo';

$argumentResolver = new DefaultArgumentResolver();

$arguments = $argumentResolver->getArguments(
    $callback,
    new ArrayResolverContext(
        [
            'bar' => 12,
        ]
    )
);

echo ($callback)(...$arguments);
// 12

就是这样。目前这没有真正的附加价值,但在处理大型复杂应用中的动态服务方法调用时非常有用。

Symfony集成

基础

容器中可以存在多个参数解析器,每个解析器将有一个专属的字符串标识符,例如

  • 当使用makinacorpus/access-control时,将创建access-control参数解析器,
  • 当使用makinacorpus/corebus时,将创建corebus参数解析器。

对于插入自定义值解析器,有两种不同的标签

  • 使用custom.argument_resolver.default标签将值解析器注册到所有参数解析器中,
  • 使用custom.argument_resolver.NAME标签,其中NAME是参数解析器标识符之一,以注册特定的值转换器。

定义新的参数解析器

无论您的具体情况如何,在项目中创建新的解析器或在自定义捆绑包中,您必须使用argument_resolver标签添加一个新的服务来定义新的服务,例如

services:
    # ... your other services
    my_custom_bundle.argument_resolver:
        class: MakinaCorpus\ArgumentResolver\DefaultArgumentResolver
        tags: [{ name: 'custom.argument_resolver', id: 'my_custom_name' }]

您还可能希望提供一些额外的自定义值解析器

services:
    # ... your other services
    MyCustomBundle\ArgumentResolver\Resolver\FooValueResolver:
        tags: ['custom.argument_resolver.my_custom_name']

请注意,在字符串custom.argument_resolver.my_custom_name中的最后一个.之后的名字指的是参数解析器的id属性。

在您的服务中,使用您自己定义的my_custom_bundle.argument_resolver服务进行注入,因为您为您的使用定义了它。

一些编译器传递将自动为您完成自动装配需要装配的任何内容。