如何在另一个 ValueResolver 中使用 ValueResolver 或使用 Symfony 链接 ValueResolver

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)

有什么想法吗?

镭谢谢