CakePHP3.4:如何发送json对象响应?

时间:2017-04-03 12:34:52

标签: cakephp-3.4

我尝试迁移到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方法:

编辑:当然我会返回响应对象,但这不能像在这里完成的那样工作!

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

但是现在我的客户没有收到任何东西。我也和邮递员一起试过,没什么!

出了什么问题?

1 个答案:

答案 0 :(得分:4)

检查迁移指南,新的响应方法遵循PSR-7不变性模式。

  

请求&回应弃用

     

3.4的大部分弃用都在RequestResponse   对象。现在修改对象的现有方法   不推荐使用,并被不可变对象后面的方法取代   PSR-7标准中描述的模式。

<强> Cookbook > 3.x Migration Guide > 3.4 Migration Guide > Request & Response Deprecations

  

采用不可变响应

     

在迁移代码之前,请使用新的响应方法   应该意识到新方法的概念差异。   通常使用with前缀来指示不可变方法。对于   例如,withLocation()。因为这些方法在不可变的情况下运行   上下文,它们返回您需要分配的新实例   变量或属性。如果您的控制器代码如下所示:

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

如果你只是想找到&amp;替换代码会中断的方法名称。   相反,您现在必须使用如下代码:

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

有一些关键的区别:

     

您的更改结果将重新分配给$this->response。这是   对于保留上述代码的意图至关重要。二传手   方法都可以链接在一起。这允许您跳过存储   所有中间对象。

<强> Cookbook > 3.x Migration Guide > 3.4 Migration Guide > Adopting Immutable Responses

简而言之,在您的情况下,您必须返回由不可变方法创建的新请求对象:

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

如果您不返回响应对象,则需要将新响应重新分配给$this->response,如上面引用中所述。