2015-12-02 35 views
0

我有我如何能改善這種「加行動」的一些問題(方法):我使用的是add動作只有在POST請求:CakePHP的添加操作在「控制器」返回JSON

1日。這是正確的 ?

第2張:action沒有意見($this->autoRender = false;)。這是正確的 ?

3:我設置以.json文件針對這一action但我沒有航線上改變路由以.json文件(該文件將被返回的時候訪問本地主機:8765 /用戶/加)。這是正確的 ?

4th:我使用Enums(手工製作)存儲將返回給用戶的消息。這是正確的 ?

第五:我使用的對象來存儲消息的字段(這將返回給用戶)時,該對象將被序列化,並返回這樣的:

$this->response->body(json_encode($response)); // It's correct ? 

控制器代碼:

public function add() 
{ 
    $this->autoRender = false; 
    $this->response->type('json'); 
    $user = $this->Users->newEntity(); 
    if ($this->request->is('post')) { 
     $user = $this->Users->patchEntity($user, $this->request->data); 
     if ($this->Users->save($user)) { 
      $this->Auth->setUser($user->toArray()); 
      $response = new ResponseMessage(); 
      $response->code = CodeEnum::USER_ADDED; 
      $response->name = NameEnum::USER_ADDED; 
      $response->type = TypeMessageEnum::SUCCESS; 
      $this->response->body(json_encode($response)); 
     } else { 
      $response = new ResponseMessage(); 
      $response->code = CodeEnum::USER_NOT_ADDED; 
      $response->name = NameEnum::USER_NOT_ADDED; 
      $response->type = TypeMessageEnum::ERROR; 
      $this->response->body(json_encode($response)); 
     } 
    } 
} 

[更新]

我把我的這個控制器上:

$this->set('response', $response); 
$this->set('_serialize', ['response']); 

但返回此JSON:

{response: {code: 1, name: "Login efetuado com sucesso.", message: null, type: "Sucesso"}} 

,但只能被退回:

{code: 1, name: "Login efetuado com sucesso.", message: null, type: "Sucesso"} 

回答

2

1:我使用add操作只有當POST請求。這是正確的 ?

第二:這個動作沒有意見($這個 - > autoRender = FALSE)。這是正確的 ?

不是。你應該使用JsonView來爲你完成工作,而不是將json字符串設置爲控制器中的響應主體。

3:我設置以.json文件,這個動作的迴應,但我並沒有對路線改​​變路由以.json文件(該文件將返回當訪問本地主機:8765 /用戶/添加)。這是正確的 ?

這很好。使用不以.json結尾的URL是不必要的。但你應該在application/json的請求中設置Accept標題。

4th:我使用枚舉(手工製作)來存儲將返回給用戶的消息。這是正確的 ?

這很好。你可以看看這個enum插件。

第五:我使用的對象來存儲消息的字段(這將返回給用戶)時,該對象將被序列化,並返回這樣的:

如以上更好說明使用JsonView。

+0

我用正確的代碼和新問題更新我的答案。 – Ricardo

+0

更改'$ this-> set('_ serialize',['response']); '到'$ this-> set('_ serialize','response'); ' – ADmad