Rad*_*ady 5 php resolver symfony symfony6
我正在使用 Symfony 6.2 和 php 8.1。
自从 SF 6.2 更新以来,我必须删除SensioFrameworkExtraBundle我的代码并将其迁移ParamConverter到新的自定义ValueResolver.
然而,我面临着这次迁移中缺少一个功能或者我错过了一些东西:(
通过自定义ParamConverter,我可以解析参数并重写Request. 这允许我链接任何ParamConverter. 新的with方式custom ValueResolver不会重写Request中的内容。当然,我可以强制重写内容或在中创建新属性,Request但我觉得这是错误或不正确的方法。
我的用例:
TranslationKey 的解析器需要 TranslationDomain 和 TranslationLanguage 的解析器结果。基本上我想链接这些解析器或将它们分组,就像我们可以在形式约束中所做的那样。
服务.yaml
App\Service\\ranslation\Request\ValueResolver\TranslationLanguageValueResolver:
tags:
- { name: controller.argument_value_resolver, priority: 103 }
App\Service\Translation\Request\ValueResolver\\TranslationDomainValueResolver:
tags:
- { name: controller.argument_value_resolver, priority: 102 }
App\Service\Translation\Request\ValueResolver\TranslationKeyValueResolver:
tags:
- { name: controller.argument_value_resolver, priority: 101 }
Run Code Online (Sandbox Code Playgroud)
我的控制器:
public function edit (Request $request,
TranslationLanguage $translationLanguage,
TranslationDomain $translationDomain,
TranslationKey $translationKey,
TranslationHelper $translationHelper,
Translation $translation): Response
{
[some code]
}
Run Code Online (Sandbox Code Playgroud)
翻译键值解析器:
public function resolve (Request $request, ArgumentMetadata $argument): iterable
{
$argumentType = $argument->getType();
if (!$argumentType || !($argumentType === TranslationKey::class)) {
return [];
}
$translationLanguage = $request->get('translationLanguage'); //=> does not return the object since it's not chained
[some code]
return [new TranslationKey($translationKey)];
}
Run Code Online (Sandbox Code Playgroud)
前 :
public function apply(Request $request, ParamConverter $configuration)
{
[some code]
$request->attributes->set($configuration->getName(), new TranslationLanguage($languages));
return true;
}
Run Code Online (Sandbox Code Playgroud)
后 :
public function resolve (Request $request, ArgumentMetadata $argument): iterable
{
$argumentType = $argument->getType();
if (!$argumentType || !($argumentType === TranslationLanguage::class)) {
return [];
}
[some code]
return [new TranslationLanguage($languages)];
}
Run Code Online (Sandbox Code Playgroud)
因此,我尝试在 Request 中使用新值创建一个新属性,但感觉非常错误,因为它假设所有解析器都已按顺序执行过。但它正在发挥作用。
我想再次旋转 TranslationKeyValueResolver 中的 TranslationLangage 和 TranslationDomain 但我不知道如何操作,也不知道在这种情况下我应该设置什么标签?自定义标签?
App\Service\Translation\Request\ValueResolver\TranslationKeyValueResolver:
tags:
- { name: controller.argument_value_resolver, priority: 101 }
- { name: another_tag_to_resolve_argument_from_resolver, priority: 101 } ??
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?
镭谢谢