2017-04-03 1 views
1

J'essaye de migrer vers 3.4 et j'ai un problème pour envoyer un objet json. Jusqu'à 3.3, j'ai utilisé le code suivant:CakePHP3.4: Comment envoyer une réponse d'objet 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); 

Et mon client a reçu ce genre d'objet:

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

Alors maintenant, je viens de remplacer les méthodes de réponse désapprouvées comme ça:

EDIT: Bien sûr, je retourne l'objet de réponse, mais cela ne peut pas fonctionner comme fait ici!

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

Mais maintenant mon client ne reçoit rien. J'ai aussi essayé avec un facteur, rien!

Qu'est-ce qui ne va pas?

Répondre

2

Vérifiez le guide de migration, les nouvelles méthodes de réponse suivent le modèle d'immutabilité PSR-7.

Demande & réponse Dépréciations

La majeure partie de deprecations 3,4 sont dans les Request et Response objets. Les méthodes existantes qui modifient les objets sur place sont maintenant désapprouvées et remplacées par des méthodes qui suivent les modèles immuables décrits dans la norme PSR-7.

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

Adoption des réponses Immuable

Avant de migrer votre code pour utiliser les nouvelles méthodes de réponse vous devriez être au courant des différences conceptuelles les nouvelles méthodes ont. Les méthodes immuables sont généralement indiquées en utilisant un préfixe avec. Pour l'exemple , withLocation(). Comme ces méthodes fonctionnent dans un contexte immuable, elles renvoient de nouvelles instances que vous devez affecter à des variables ou à des propriétés . Si vous aviez le code du contrôleur qui ressemblait à:

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

Si vous deviez trouver simplement & remplacer les noms de méthode votre code serait briser. Au lieu de cela, vous devez maintenant utiliser le code qui ressemble à:

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

Il y a quelques différences importantes:

Le résultat de vos modifications est réaffecté à $this->response. Ceci est critique pour préserver l'intention du code ci-dessus. Les méthodes de setter peuvent toutes être chaînées ensemble. Cela vous permet d'ignorer le stockage tous les objets intermédiaires.

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

Longue histoire courte, dans votre cas, vous devez retourner le nouvel objet de la demande créée par les méthodes immuables:

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

Si vous ne recouvrerait un objet de réponse, alors vous devrez réattribuer la nouvelle réponse à $this->response comme mentionné dans la citation ci-dessus.

+0

argghhhh! bien sûr. tellement stupide! – 2ndGAB