Как запихнуть JSON в Response?

Корень вопроса лежит здесь stackoverflow.com/questions/28683727/submit-form-w... .
Суть в том, что нельзя применить $form->handleRequest($request), т.к. JSON отсутствует в объекте $request, но доступен через $request->getContent() .
Собственно вопрос: как грамотно запихнуть JSON в $request, не используя костыли?
  • Вопрос задан
  • 2378 просмотров
Пригласить эксперта
Ответы на вопрос 4
@shoomyst
dumb
$request = $request->duplicate(null, json_decode($request->getContent()));

Но это наверное не лучший вариант
Ответ написан
Комментировать
bboytiwst
@bboytiwst
Сегодня помогал товарищу с Silex"ом и там есть вот такая штука

$app->before(function (Request $request) {
    if (0 === strpos($request->headers->get('Content-Type'), 'application/json')) {
        $data = json_decode($request->getContent(), true);
        $request->request->replace(is_array($data) ? $data : array());
    }
});


этот код очень легко перенести на симфони, просто зарегистрировав listener symfony.com/doc/current/cookbook/service_container...

Ссылки на все готовое
labs.qandidate.com/blog/2014/08/13/handling-angula... - пост
https://github.com/qandidate-labs/symfony-json-req... - listener
Ответ написан
Комментировать
@emigrant90 Автор вопроса
по идее это можно занести непосредственно в класс Request, вот в эту функцию
public static function createFromGlobals()
    {
        // With the php's bug #66606, the php's built-in web server
        // stores the Content-Type and Content-Length header values in
        // HTTP_CONTENT_TYPE and HTTP_CONTENT_LENGTH fields.
        $server = $_SERVER;
        if ('cli-server' === php_sapi_name()) {
            if (array_key_exists('HTTP_CONTENT_LENGTH', $_SERVER)) {
                $server['CONTENT_LENGTH'] = $_SERVER['HTTP_CONTENT_LENGTH'];
            }
            if (array_key_exists('HTTP_CONTENT_TYPE', $_SERVER)) {
                $server['CONTENT_TYPE'] = $_SERVER['HTTP_CONTENT_TYPE'];
            }
        }

        $request = self::createRequestFromFactory($_GET, $_POST, array(), $_COOKIE, $_FILES, $server);

        if (0 === strpos($request->headers->get('CONTENT_TYPE'), 'application/x-www-form-urlencoded')
            && in_array(strtoupper($request->server->get('REQUEST_METHOD', 'GET')), array('PUT', 'DELETE', 'PATCH'))
        ) {
            parse_str($request->getContent(), $data);
            $request->request = new ParameterBag($data);
        }

        return $request;
    }


Форкни Симфонивский вендор бандл, может одобрят, будет тебе плюс в карму размером с лайнер)
Ответ написан
Комментировать
fearintino
@fearintino
Php - Developer
Как на счет такого варианта:
$content = $this->get("request")->getContent();
$params = json_decode($content, true);
$request->request->add($params);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы