我需要从服务访问$ _POST变量,我不想将request
作为参数传递,因为我认为这会迫使我在服务中使用scope: request
并且我很糟糕来自此范围的过去的记忆,因为这会强制每个请求一个服务实例,而不是每个应用程序一个实例。
问题是$ _POST可以正常工作,但是因为symfony最佳实践建议避免使用php原语,我问是否有更好的方法(在服务中避免使用scope: request
)
答案 0 :(得分:1)
如果您使用的是2.4+,则可以使用request_stack
,请参阅here。
你会像...一样使用它。
services.yml
your.service:
class: FQCN\To\Your\Service
arguments:
- @request_stack
FQCN \至\您\服务
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestStack;
class Service
{
/**
* @var RequestStack
*/
private $requestStack;
/**
* @var Request
*/
private $request;
public function __construct(RequestStack $requestStack)
{
$this->requestStack = $requestStack;
}
public function yourCall()
{
$param = $this->getRequest()->request->get('your-post-parameter');
//...
}
/**
* Get current request object
*
* @return Request
*/
private function getRequest()
{
if (null === $this->request) {
$this->request = $this->requestStack->getCurrentRequest();
}
return $this->request;
}
}
答案 1 :(得分:0)
我没有看到像下面这样做的任何问题,这是我前段时间做的。你没有注入整个请求。
<强> CONTROLLER 强>
public function searchByGetAction(Request $request)
{
//.......
$results = $this->productSearchService->findWithSimpleArray(
$request->query
);
//.......
}
public function searchByPostAction(Request $request)
{
//.......
$results = $this->productSearchService->findkWithNestedArray(
json_decode($request->getContent(), true)
);
//.......
}
<强>服务强>
public function findWithSimpleArray(ParameterBag $searchParameters)
{
$name = $searchParameters->get('name');
$surname = $searchParameters->get('surname');
//.......
}
public function findWithNestedArray($searchParameters = [])
{
$name = isset($searchParameters['name']) ? $searchParameters['name'] : null;
$surname = isset($searchParameters['surname']) ? $searchParameters['surname'] : null;
//.......
}