我尝试迁移到 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);
Run Code Online (Sandbox Code Playgroud)
我的客户收到了这样的对象:
{
"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": []
}
Run Code Online (Sandbox Code Playgroud)
所以现在我只是替换了弃用的 Response 方法:
编辑:当然我返回响应对象,但不能像这里完成的那样工作!
$this->response->withType('application/json');
$this->response->withStringBody($jsonSites);
return $this->response;
Run Code Online (Sandbox Code Playgroud)
但现在我的客户没有收到任何东西。我也试过邮递员,没有!
怎么了?
查看迁移指南,新的响应方法遵循 PSR-7 不变性模式。
请求和响应弃用
3.4 的大部分弃用在
Request和Response对象中。就地修改对象的现有方法现已弃用,并被遵循 PSR-7 标准中描述的不可变对象模式的方法所取代。
Cookbook > 3.x 迁移指南 > 3.4 迁移指南 > 请求和响应弃用
采用不可变的响应
在迁移代码以使用新的响应方法之前,您应该了解新方法在概念上的差异。不可变方法通常使用带前缀的表示。例如,
withLocation()。因为这些方法在不可变的上下文中运行,所以它们返回需要分配给变量或属性的新实例。如果您的控制器代码如下所示:Run Code Online (Sandbox Code Playgroud)$response = $this->response; $response->location('/login') $response->header('X-something', 'a value');如果您只是简单地查找和替换方法名称,您的代码就会中断。相反,您现在必须使用如下所示的代码:
Run Code Online (Sandbox Code Playgroud)$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);
Run Code Online (Sandbox Code Playgroud)
如果您不返回响应对象,那么您需要将新的响应重新分配给$this->response上面引用中提到的。
| 归档时间: |
|
| 查看次数: |
1287 次 |
| 最近记录: |