如何创建服务并将请求内容和查询字符串作为参数注入?

How to create a service and inject the request content and query string as arguments?

我正在尝试围绕请求参数编写自己的包装器,因此我可以在请求堆栈不可用的整个系统中(例如在命令中)重复使用相同的参数 class。目前,一些服务注入了一个请求包装器,它本身也注入了 RequestStack

我希望实现的是,在services.yml中,定义服务App\Util\Parameters应该从下面注入$queryString$content的值示例:

class SomeService {

    public function __construct(Symfony\Component\HttpFoundation\RequestStack $stack)
    {
        $request = $stack->getCurrentRequest();
        ...
        $queryString = $request->getQueryString();
        $content = $request->getContent();
        ...

所以,在 services.yml,我希望做这样的事情:

# psuedo-config..!
App\Util\Parameters:
  arguments:
    $content: ['requestStack.currentRequest.getContent']
    $queryString: ['requestStack.currentRequest.getQueryString']

鉴于以下 class:

namespace App\Util;

class Parameters {
    public function __construct(protected mixed $content = [], protected string $queryString = "")
    {
    ...

我希望在系统的其他部分,RequestStack 不可用,我可以做类似下面的事情来覆盖注入,

$params = new Parameters(['foo' => 'bar']);

但是在 Parameters 服务 被注入的情况下, 值将从请求中填充。

您需要创建 a service factory

App\Util\Parameters:
  factory: '@App\Util\ParameterFactory'

然后是工厂:

class ParameterFactory {

    public function __construct(private RequestStack $stack)
    {}

    public function __invoke(): Parameters {
        $request = $this->stack->getCurrentRequest();
        
        $queryString = $request->getQueryString();
        $content = $request->getContent();

        return new Parameters($content, $queryString);
    }

}