如何创建服务并将请求内容和查询字符串作为参数注入?
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);
}
}
我正在尝试围绕请求参数编写自己的包装器,因此我可以在请求堆栈不可用的整个系统中(例如在命令中)重复使用相同的参数 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);
}
}