[CakePHP] PHPのCakeからAjax要請がある時、jsonタイプ(json_encode関数)でResponseする方法とControllerでViewを選択する方法


Study / PHP    作成日付 : 2020/02/08 03:00:00   修正日付 : 2020/02/11 20:15:22

こんにちは。明月です。


この投稿はPHPのCakeからAjax要請がある時、jsonタイプ(json_encode関数)でResponseする方法とControllerでViewを選択する方法に関する説明です。


前の投稿でCake+Smartyの組み合わせでウェブブラウザから要請がくるとControllerを通ってViewを読み込んでResponseする方法に関して説明しました。

link - [CakePHP] MVCフレームワークのCakeをインストールする方法


ウェブサービスでは必ずHtmlドキュメント形式でResponseすることじゃありません。例えば、Ajaxの機能ならjsonタイプのデータを受取る時もあるし、ファイルをダウンロードする時もあります。

その時にはActionメソッドでリターン値がテキストやバイナリタイプで受け取ってブラウザ側にResponseしなければならないです。

JavaだとResponseBodyアノテーションを設定してString値にリターンすることと同じ意味です。

これからActionメソッドからajax値を受け取りましょう。


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形式に変換する関数です。参考にObjectタイプはjsonタイプに変換しません。

Java(Gson)やC#(Newton)はライブラリに提供しますが、PHPの場合は内部関数で提供します。PHPの長所は細かい内部関数が多いことです。別にライブラリがなくてもプログラムを立ち上げることで無理がありません。


また、ソースに戻してHomeのindexのビューでJavascriptで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から「/Ajax/index」を呼出します。AjaxControllerのindex関数が呼ばれます。

jsonタイプで要求しています。idがdataのオブジェクトにはjsonのdataの値を、data1のオブジェクトにはjsonのdata1の値を入れました。


Actionメソッドのリターン値で許すデータはnullと$this->response値だけです。その以外のデータはエラーが発生します。


そうするとControllerのActionとテンプレートのファイル名はいつも一致しなければならないかと考えるとそうじゃありません。

なぜならその結果は似てるなビューページがある時、例えば掲示板のサイトで追加、修正ページの場合はページ形が似ているがそうするとviewページを2つに作成して一つはコピーするという意味になります。

でもCakeフレームワークにはビューページを選択できるようにrenderという関数があります。

<?php
namespace App\Controller;

class HomeController extends AppController {
  // index関数はなにも設定してないので、index.ctlを呼出します。
  public function index(...$path) {

  }
  // other関数の場合はrender関数で/Home/index.ctlページを呼出します。
  public function other(...$path) {
    $this->render("/Home/index");
  }
}

other関数をみるとrender関数を利用してindex.ctlページを呼出すように設定しました。


ActionメソッドとViewファイル名は必ず一致しなくてもいいという意味になります。


上のAjaxの例を同じ結果になります。


ここまでPHPのCakeからAjax要請がある時、jsonタイプ(json_encode関数)でResponseする方法とControllerでViewを選択する方法に関する説明でした。

ご不明なところや間違いところがあればコメントしてください。

最新投稿