Cakephp PHP WEB開発

【Cakephp2→4】Component内でのレスポンスセットの移行

※本サイトはPR表記を含みます。

Cake2とCake4ではレスポンスオブジェクトの扱い方が少し変わっています。コンポーネント内でのレスポンスセットに触れる機会があったので、それを基に記します。

基本的にコントローラーを呼びだしてレスポンスオブジェクトにセットするという流れは同じです。

Cake2: コンポーネント内にてレスポンスセット

// intializeでコントローラーセット
public function initialize(Controller $controller) {
    $this->controller = $controller;
}

// メソッド内にてレスポンスセット例
$this->controller->response->download('ダウンロードファイル名');
$this->controller->response->type('csv');
$this->controller->response->body($csv); // CSVの内容などを変数に格納しているものとする

 

Cake4: コンポーネント内にてレスポンスセット

// コントローラー以外では $this->response で拾えないので getResponse() する必要がある
$response = $this->getController()->getResponse();
$response = $response->withDownload('ダウンロードファイル名');
$response = $response->withType('csv');
$response = $response->withStringBody($csv);
$this->getController()->setResponse($response);

コードのコメントにも書きましたが、各コントローラー内でレスポンスオブジェクトにセットする場合では、getResponse() せずとも $this->response で拾えるはずです。

コンポーネントなどは上記コードのようにし、レスポンスセットすればOK。

Cake2とCake4でメソッド名を比べてみると、各メソッドに with が付与されている場合が多くなっています。メソッド自体が非推奨だったり、削除されているわけでもないのでまだ分かりやすい方ですね。

それと設定したレスポンスは最後に setResponse() でセットする必要があります。

Cakephp4: コンテンツタイプの扱い
https://book.cakephp.org/4/ja/controllers/request-response.html#index-1

-Cakephp, PHP, WEB開発
-