[CakePHP] Ajax요청시 json타입(json_encode) 응답 방법과 view 파일을 선택하는 방법


Study/PHP  2019. 10. 1. 23:14

안녕하세요. 명월입니다.


이 글은 PHP의 Cake에서 Ajax요청시에 json타입(json_encode 함수 사용)으로 응답하는 방법과 Contoller에서 view를 선택하는 방법에 대한 글입니다.


저는 Cake + smarty 를 통해서 웹 브라우져에서 요청이 오면 controller를 통해서 view를 읽어드려 응답하는 방법까지 소개했었습니다.

링크 - [PHP] MVC 프레임워크 Cake를 설치하는 방법


그러나 웹 브라우져에서 ajax요청이 오면 html이 아닌 json형태로 응답을 해야할 경우가 있습니다. 그때는 controller에서 view를 리턴하는 것이 아니고 controller에서 만든 데이터를 그대로 text형태로 리턴해야 합니다.

Java에서 ResponseBody 어노테이션으로 설정해서 String으로 리턴하는 것과 비슷합니다.

링크 - [Java강좌 - 43] Web Spring framework의 Controller에서 ajax의 요청시 json을 반환하는 방법


먼저 Controller를 추가하겠습니다. AjaxController를 추가해서 ajax데이터를 만듭니다.

<?php
namespace App\Controller;

class AjaxController extends AppController{
  public function index(...$path){
    // json로 변환할 배열을 만든다.
    $data = array(
      'data' => 'hello world',
      'data1' => 'ajax Test'
    );
    // json_encode는 array타입을 json로 변환하는 함수이다.
    $str = json_encode($data);
    
    // response에서 body stream을 취득한다.
    $body = $this->response->getBody();
    // body에 json 타입을 넣는다.
    $body->write($str);
    // body를 response에 결합한다.
    $this->response->withBody($body);
    // view를 넣는 것이 아닌 그냥 reponse형식으로 반환한다.
    return $this->response;
  }
}

위 소스에서 json_encode의 함수는 array형식을 json형식으로 바꾸어 주는 것입니다. class 타입은 변경을 안합니다.

다른 언어는 Gson(java)이던가 Newton(C#)라이브러리를 연결해서 바꿔야 하는데 PHP는 아예 내장 함수로 탑재가 되어있네요. PHP의 좋은 점이 이런 내장 함수가 정말 많다는 것입니다. 따로 라이브러리 연결할 필요가 없네요.


그리고 메인 Home의 index에서 ajax로 데이터를 호출하는 화면을 만듭니다.

<input type="text" id="data"><br />
<input type="text" id="data1">
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script>
  $(function() {
    $.ajax({
      type : "GET",
      url : "/Ajax/index",
      dataType: "json",
      success : function(msg) {
        $("#data").val(msg.data);
        $("#data1").val(msg.data1);
      }
    });
  });
</script>

제대로 ajax를 호출해서 데이터를 받아 왔습니다.


예전과 다른점은 Controller에서 return 데이터가 있는 것입니다. $this->response를 리턴을 시키면 view를 호출하는 것이 아닌 response 안의 데이터가 호출되는 것입니다.

참고로 Controller의 Action에서 null과 $this->reponse 이외의 데이터를 리턴하면 에러가 발생합니다.


그럼 Controller에서 꼭 view 파일명과 일치를 시켜야 하는 것인가? 비슷한 화면이라면 계속 복사 붙여넣기를 해야하는가는 의문이 생깁니다만, return 타입이 아닌 render 함수를 통해 view를 선택할 수도 있습니다.

<?php
namespace App\Controller;

class HomeController extends AppController{
  public function index(...$path){

  }
  public function other(...$path){
    $this->render("/Home/index");
  }
}

other의 함수를 보면 제가 $this->render를 해서 /Home/index를 설정했습니다. 이 뜻은 Template 폴더 밑의 Home/index.ctp를 가르키는 것입니다.

즉 Controller와 index명을 일치시키지 않아도 Template를 선택할 수 있는 것입니다.

똑같은 결과를 내보냅니다.


여기까지 PHP의 Cake에서 Ajax요청시에 json타입(json_encode 함수 사용)으로 응답하는 방법과 Contoller에서 view를 선택하는 방법에 대한 글이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.