如何在注释中使用 Symfony 容器参数?

How to use Symfony container parameters in annotations?

通常可以在 Symfony 5.3+ 的 method/class 注释中使用容器参数吗?

例如,我的一个操作方法使用 @ParamConverter 注释,使用 FOSRest RequestBodyParamConverter:

class SomeController extends AbstractController {   
    /**
     * @ParamConverter("post", converter="fos_rest.request_body")
     */
    public function sync(Request $request, Post $post): Response {
        ...
    }
}

我不想在这里明确指定转换器,而是想使用容器参数。但是,这似乎不起作用。

我检查过参数定义是否正确:

$ php bin/console debug:container --parameters
...
my.post.converter     fos_rest.request_body

但是我不能使用它:

/**
  * @ParamConverter("post", converter="%my.post.converter%")
  */

No converter named '%my.post.converter%' found for conversion of parameter 'post'.

我发现 other questions 表明应该可以使用参数。至少在使用 @Route.

等其他注释时是这样

这是 @ParamConverter 注释的限制(= @Route 注释的特殊功能),还是我的设置有问题?

我知道在此示例中还有其他方法可以指定不同的转换器。然而,这只是一个例子,问题是,是否可以在这里使用参数,或者我是否犯了一些错误。

并非所有注释都是平等的。每个都有自己的处理器,每个注释参数都有不同的接受输入。

注释只是启用一些底层组件,所以有时(可能大多数时候)如果你可以在注释中使用容器参数,那是因为底层组件支持为该参数使用容器参数(就像现在一样)路由组件的情况,可以通过 annotations/attributes)

以外的其他方式配置

在问题提供的示例中使用容器参数不会特别有用,如果有的话。

该参数需要一个 服务 ID,并且由于这些 ID 是在容器配置中定义的(与配置参数的位置相同), 将定义移动到参数将一无所获。

如果你想让它“可配置”,可以使用自定义服务 ID you could define as an alias to the real service,这样你就可以拥有多个转换器并通过配置为正确的转换器取别名。

不相信这在现实生活中会有用,但您的应用程序约束可能完全不同。