CakePHP3.4: Как отправить ответ объекта json?

Я пытаюсь перейти на 3.4, и у меня проблема с отправкой объекта json. До версии 3.3 я использовал следующий код:

$jsonSites = json_encode([
    'reqLocation' => [
        'latitude' => $latitude,
        'longitude' => $longitude
    ],
    'sites' => $sitesList,
    'discoveryBooks' => $discoveryBooksList,
    'deleteSites' => !empty($inDeviceSites) ? [$inDeviceSites] : [],
    'deleteBooks' => !empty($inDeviceBooks) ? [$inDeviceBooks] : []
]);

$this->response->type('application/json');
$this->response->body($jsonSites);

И мой клиент получил такой объект:

{
  "reqLocation": {
    "latitude": 48.080563,
    "longitude": 4.4649
  },
  "sites": [
    {
      "id": 5076,
      "name": "...",
      "modified": "2017-01-28T03:03:23+00:00",
      "directory_name": "fr/26/26120_56cc30ea4d907",
      "type": "portail",
      "longitude": 7.031953,
      "latitude": 47.939468,
      "image_0": "jpg",
      "picto_color": "#FFDDDDDD",
      "agthemes": [],
      "distance": 131.29188575851,
      "category": 1281,
      "category_name": "Jardin",
      "sitecategories": [
        {
          "id": 10,
          "code": 1281,
          "name_fr": "Jardin",
          "_joinData": {
            "id": 1876,
            "site_id": 5076,
            "site_category_id": 10,
            "authorized": true
          }
        },
        {
          "id": 33,
          "code": 1283,
          "name_fr": "Jardin botanique",
          "_joinData": {
            "id": 5693,
            "site_id": 5076,
            "site_category_id": 33,
            "authorized": true
          }
        }
      ]
    },
  ],
  "discoveryBooks": [],
  "deleteSites": [],
  "deleteBooks": []
}

Итак, теперь я просто заменил устаревшие методы Response следующим образом:

EDIT: Конечно, я возвращаю объект ответа, но это не может работать так, как здесь!

$this->response->withType('application/json');
$this->response->withStringBody($jsonSites);
return $this->response;

Но теперь мой клиент ничего не получает. Я также пробовал с почтальоном, ничего!

Что случилось?


person fralbo    schedule 03.04.2017    source источник


Ответы (1)


Ознакомьтесь с руководством по миграции, новые методы ответа соответствуют шаблону неизменности PSR-7.

Устаревшие запросы и ответы

Основная часть устаревания для 3.4 приходится на объекты Request и Response. Существующие методы, которые изменяют объекты на месте, теперь устарели и заменены методами, которые следуют шаблонам неизменяемых объектов, описанным в стандарте PSR-7.

Поваренная книга > 3. x Руководство по миграции > Руководство по миграции 3.4 > Устаревшие запросы и ответы

Принятие неизменяемых ответов

Прежде чем выполнять миграцию кода для использования новых методов ответа, вы должны знать о концептуальных различиях новых методов. Неизменяемые методы обычно обозначаются с помощью префикса with. Например, withLocation(). Поскольку эти методы работают в неизменном контексте, они возвращают новые экземпляры, которые необходимо присвоить переменным или свойствам. Если бы у вас был код контроллера, который выглядел так:

$response = $this->response;
$response->location('/login')
$response->header('X-something', 'a value');

Если бы вы просто нашли и заменили имена методов, ваш код сломался бы. Вместо этого теперь вы должны использовать код, который выглядит так:

$this->response = $this->response
    ->withLocation('/login')
    ->withHeader('X-something', 'a value');

Есть несколько ключевых отличий:

Результат ваших изменений переназначается на $this->response. Это очень важно для сохранения цели приведенного выше кода. Все методы установки могут быть объединены в цепочку. Это позволяет пропустить сохранение всех промежуточных объектов.

Поваренная книга > 3. x Руководство по миграции > Руководство по миграции 3.4 > Использование неизменяемых ответов

Короче говоря, в вашем случае вы должны вернуть новый объект запроса, созданный неизменяемыми методами:

return $this->response
    ->withType('application/json');
    ->withStringBody($jsonSites);

Если вы не вернете объект ответа, вам нужно будет переназначить новый ответ на $this->response, как указано в приведенной выше цитате.

person ndm    schedule 03.04.2017