Переопределить содержимое подзапроса в Symfony4 - PullRequest
0 голосов
/ 03 апреля 2020

рассмотрим следующий код:

    /** @var Request $request */
    $request = $this->container->get('request_stack')->getCurrentRequest();
    $path['_controller'] = $controller;
    $subRequest = $request->duplicate($query, null, $path);

    return $this->container->get('http_kernel')->handle($subRequest, HttpKernelInterface::SUB_REQUEST);

Это тело метода ::forward(), который выдает подзапрос в Symfony4.

Я ищу способ отправить запрос POST с измененными параметрами POST. Для этого мне нужно изменить Request::$content, но я не вижу интерфейса для этого.

Есть ли решение без перестройки запроса вручную?

1 Ответ

0 голосов
/ 03 апреля 2020

ОК, есть рабочий код. Может быть, это кому-нибудь поможет. Это не совсем красиво, но работает.

private function subRequest(string $controller, $params = []): Response
    {
        $isPost = false !== strpos($controller, 'post');
        /** @var Request $request */
        $request = $this->container->get('request_stack')->getCurrentRequest();

        $attr = [
            '_controller' => $controller,
        ];

        $params = (array)$params;

        if ($isPost) {
            $subRequest = $this->duplicateRequestForPost($request, $params, $attr);
        } else {
            $subRequest = $request->duplicate($params, null, $attr);
        }

        return $this->container->get('http_kernel')
            ->handle($subRequest, HttpKernelInterface::SUB_REQUEST);
    }

    /**
     * Just to replace $request->content ...
     */
    private function duplicateRequestForPost(Request $request, array $postParams, array $attributes): Request
    {
        $postRequest = new Request(
            [],
            [],
            [],
            [],
            [],
            [],
            \Safe\json_encode($postParams)
        );

        $postRequest->query = $request->query;
        $postRequest->request = $request->request;
        $postRequest->cookies = $request->cookies;
        $postRequest->files = $request->files;
        $postRequest->server = $request->server;

        $postRequest->attributes = new ParameterBag($attributes);

        return $postRequest;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...