2017-04-03 151 views
1

我嘗試遷移到3.4,並有問題發送json對象。 高達3.3,我用下面的代碼:CakePHP3.4:如何發送json對象響應?

$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": [] 
} 

所以,現在我剛剛更換過時的應對方法,如認爲:

編輯:當然,我返回響應對象,但不能像在這裏完成!

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

但現在我的客戶端沒有收到任何東西。我也試過郵差,沒事!

怎麼了?

回答

2

查看遷移指南,新的響應方法遵循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'); 

如果你簡單地找到&取代你的代碼會破壞方法名。 相反,你現在必須使用的代碼看起來像:

$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,如上面的引用中所述。

+0

argghhhh!當然。如此愚蠢! – 2ndGAB