[CakePHP] RequestとResponseに関して


Study / PHP    作成日付 : 2020/02/12 03:00:02   修正日付 : 2020/02/12 03:00:02

こんにちは。明月です。


この投稿はPHPのCakeフレームワークのRequestとResponseに関する説明です。


Requestとはウェブブラウザからウェブサーバに要請したデータ(headerとbody)です。Responseとはウェブサーバからウェブブラウザに応答するデータ(headerとbody)です。

要請するタイプには「GET」タイプと「POST」タイプがあります。そのことでGETのQuery Stringは「$_GET」から取得するしPOSTのForm dataは「$_POST」から取得することを説明したことがあります。

また、headerのデータは$_SERVERから取得することも説明しました。

link - [PHP] $_SERVER, $GLOBALS, $_GET, $_POST, $_REQUEST, $_COOKIE, $_SESSION, $_FILES, $_ENV(getenv())


以前、説明したデータをCakePHPフレームワークでももちろん使えます。でもデータ流れの構造を設計、管理するCakePHPフレームワークを使っているから内部オブジェクトでheaderデータを取得しましょう。

link - https://book.cakephp.org/3/ja/controllers/request-response.html


Request

ウェブブラウザからウェブサーバに接続する時の要請上です。ヘッダ情報や、セッション情報があります。

$this->getRequest()->getAttributes()と$this->getRequest()->getParam(キー)

getParamの関数の情報はgetAttributesの「params」のデータになっています。

<?php
namespace App\Controller;

class HomeController extends AppController {
  public function index() {
    // RequestのデータでgetAttributes関数の結果を表示する。
    var_dump($this->getRequest()->getAttributes());
    // RequestのデータでgetParam()関数の結果を表示する。
    var_dump($this->getRequest()->getParam('controller'));
  }
}


実はgetAttributes()関数はroutes.phpからControllerを呼出す時にデータを渡すパラメータです。


上の例の場合はcontroller、actionしかありませんが、connect関数にパラメータを付けるとgetAttributes()関数で取得ができます。


$this->getRequest()->getQuery()

このデータはHttpメソッドがGETの時に受取るQuery Stringの値です。

<?php
namespace App\Controller;

class HomeController extends AppController {
  public function index() {
    // Query string値を出力。
    var_dump($this->getRequest()->getQuery());
  }
}


参考にgetQuery関数で初めのパラメータはキー名、2つ目のパラメータはデフォルト値です。

<?php
namespace App\Controller;

class HomeController extends AppController {
  public function index() {
    // Query StringデータをArrayタイプに取得
    var_dump($this->getRequest()->getQuery());
    // GET Stringデータをexampleキーで取得する。デフォルト値は「Nothing」だ。
    $data = $this->getRequest()->getQuery("example", "Nothing");
    var_dump($data);
  }
}


$this->getRequest()->getData()

この関数はHttpメソッドがPOSTの時に受取るFormデータです。

使用方法はgetQueryと同じです。

<?php
namespace App\Controller;

class HomeController extends AppController {
  public function index() {
    // FormデータをArrayタイプに取得
    var_dump($this->getRequest()->getData());
    // Formデータをexampleキーで取得する。デフォルト値は「Nothing」だ。
    $data = $this->getRequest()->getData("example", "Nothing");
    var_dump($data);
  }
}


$this->getRequest()->is()

この関数は要請メソッドタイプチェック関数です。つまり、is('post')の場合はPOSTはtrueを、そうじゃないならfalseを返却します。

探索可能なキーワードは「get」、「put」、「patch」、「post」、「delete」、「head」、「options」、「ajax」、「ssl」、「flash」、「requested」、「json」、「xml」があります。

<?php
namespace App\Controller;

class HomeController extends AppController {
  public function index() {
    // メソッドGETタイプをチェックする。
    var_dump($this->getRequest()->is('get'));
    // メソッドPOSTタイプをチェックする。
    var_dump($this->getRequest()->is('post'));
  }
}


$this->getRequest()->session()

セッションデータを取得する関数です。

<?php
namespace App\Controller;

class HomeController extends AppController {
  public function index() {
    // セッションデータを取得する。
    var_dump($this->getRequest()->session());
    // セッションにTestキーでデータを格納する。
    $this->getRequest()->session()->write("Test", "Example");
    // セッションにTestキーでデータを取得する。
    var_dump($this->getRequest()->session()->read("Test"));
    // セッションを初期化する。
    $this->getRequest()->session()->clear();
    // セッションにTestキーでデータを取得する。
    var_dump($this->getRequest()->session()->read("Test"));
  }
}


$this->request->getCookieParams()、$this->getRequest()->getCookie()

クッキーを取得する関数です。

<?php
namespace App\Controller;

class HomeController extends AppController {
  public function index() {
    // クッキーのデータを取得する。
    var_dump($this->getRequest()->getCookieParams());
    // クッキーのTESTキーで取得する。デフォルト値は「Nothing」だ。
    var_dump($this->getRequest()->getCookie('TEST', 'Nothing'));
  }
}


セッションキー値はCookieには見えないですね。クッキーの中でcsrfTokenキー見えますね。ページのセキュリティでToken設定するものですが、設定は複雑ですがそんなに有用なミドルウェアじゃないです。


Response

ウェブサーバからウェブブラウザに応答する情報です。基本的にcakePHPはヘッダからバディまで自動に作成してくれます。

別にユーザが修正する領域はないですが、エラーコード管理やブラウザにサーバ側のクッキー設定(Set-Cookie)をする時使います。

$this->getResponse()->withType() , $this->getResponse()->withStringBody()

withTypeはContext-Typeを設定します。

withStringBodyは応答のボディを設定します。

※PHPは基本的にポインタレファレンスがなくて、全て値レファレンスですね。$this->getResponse()で出るResponseの関数で格納や修正、設定すると返却は全てResponse値です。でも入力、返却値が違います。

<?php
namespace App\Controller;

class HomeController extends AppController {
  public function index() {
    // Responseオブジェクトを受取る。
    $response = $this->getResponse();
    // context-typeを設定する。
    $response = $response->withType('application/json');
    // bodyを設定する。
    $response = $response->withStringBody(json_encode(['data' => 'hello world']));	
    return $response;	
  }	
}


$this->getResponse()->withStatus(error code);

ブラウザ応答のエラーコードを設定します。

<?php
namespace App\Controller;

class HomeController extends AppController {
  public function index() {
    // Viewページを設定してResponseを取得する。
    $response = $this->render("/Home/index");
    // 応答コードを設定する。
    $response = $response->withStatus(599);
    return $response;
  }
}


$this->getResponse()->withCookie(cookie class);

サーバ側からクッキーを設定する。

参考:クッキーはブラウザに格納データですが、サーバから格納する時にはブラウザ応答する時にヘッダに「Set-Cookie」を入れてブラウザにクッキーが設定するようにします。

<?php
namespace App\Controller;
use Cake\Http\Cookie\Cookie;
use Cake\I18n\Date;

class HomeController extends AppController {
  public function index() {
    // クッキーを作る。
    $cookie = new Cookie (
      'ExampleCookie',          // クッキーキー
      1,                        // 値
      new \DateTime('+1 year'), // 満了時間
      '/',                      // クッキーパス
      'localhost',              // クッキードメイン
      false,                    // secure only
      true                      // http only
    );
    // Viewを設定してResponseオブジェクトを受取る。
    $response = $this->render("/Home/index");
    // クッキーを設定する。
    $response = $response->withCookie($cookie);
    return $response;
  }
}


その以外にRequestとResponseが提供する関数はもっと多いです。でも、よく使わないし、この投稿で全て説明するのは大変ですね。

link - https://book.cakephp.org/3/ja/controllers/request-response.html


ここまでPHPのCakeフレームワークのRequestとResponseに関する説明でした。


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

最新投稿