makinacorpus / argument-resolver
回调参数解析器接口和实现。
1.0.7
2023-05-16 13:06 UTC
Requires
- php: >= 8.0
- makinacorpus/profiling: ^1.3 || ^2.0
Requires (Dev)
- phpunit/phpunit: ^9.2
- psr/log: ^1.1 || ^2 || ^3
- symfony/config: ^5.4 || ^6.0
- symfony/dependency-injection: ^5.4 || ^6.0
- symfony/framework-bundle: ^5.4 || ^6.0
- symfony/http-kernel: ^5.4 || ^6.0
- symfony/yaml: ^5.4 || ^6.0
README
提供回调参数解析器接口和实现,与symfony/http-kernel
的ArgumentResolver
类实现非常相似,但可用于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
服务进行注入,因为您为您的使用定义了它。
一些编译器传递将自动为您完成自动装配需要装配的任何内容。