1

我尝试迁移到 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;

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

怎么了?

4

1 回答 1

5

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

请求和响应弃用

3.4 的大部分弃用在RequestandResponse 对象中。现有的就地修改对象的方法现在已被弃用,并被遵循 PSR-7 标准中描述的不可变对象模式的方法所取代。

Cookbook > 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. 这对于保留上述代码的意图至关重要。setter 方法都可以链接在一起。这允许您跳过存储所有中间对象。

Cookbook > 3.x 迁移指南 > 3.4 迁移指南 > 采用不可变响应

长话短说,在您的情况下,您必须返回由不可变方法创建的新请求对象:

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

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

于 2017-04-03T13:03:32.493 回答