CakePHP3.4で非推奨になったResponse::body()をResponse::withBody()に書き換えるときにややハマった

CakePHP3.4で非推奨になったResponse::body()をResponse::withBody()に書き換えるときにややハマった技術的なこと
この記事は約3分で読めます。

非推奨を教えてくれるPhpStorm

PhpStormというエディタを使い始めて1年ちょっとになるんですが、ほんとに優秀です。CakePHP3でシステム構築している際にも、非推奨のメソッドを教えてくれたりします。CakePHP4系に変わった時に、スムーズに移行できるように非推奨なやり方はできるだけ減らしておきたいですからね。

↑こんな感じで、bodyメソッドが非推奨(deprecated)なのを教えてくれます。

非推奨メソッドは積極的に書き替えて行ってるんですが、ちょっとだけハマったので共有しておきます。

 

Response::body()をResponse::withBody()に単純に置き換えてもうまく動かない

先ほどの画像の所がまさにそうなんですが、Response::body()をResponse::withBody()に置き換えたかったんです。で、素直に

$this->response->body($response_html);

$this->response->withBody($response_html);

 

とやったんですが、うまくいきません。以下のようなエラーが出てしまいました。

 

Warning (4096): Argument 1 passed to Cake\Http\Response::withBody() must implement interface Psr\Http\Message\StreamInterface, string given

 

ネットで調べてみたら、本家Githubで同じことにハマっていた先人の質問と回答を発見。

3.4 Regression on Cake\Http\Response::withBody(string) · Issue #10290 · cakephp/cakephp
Thisisa(multipleallowed):bugenhancementfeature-discussion(RFC)CakePHPVersion:3.4.2.ContextTryingtoupgradeCakePHP3.3projectto3.4usingnewimmutableRequest/Response...

 

どうやらwithBody()の引数はStreamInterface型じゃなきゃいけないみたいです。ゴニョゴニョ書くこともできますがシンプルな書き換えは以下の感じです。

 

答え

$this->response->body($response_html);

$this->response->getBody()->write($response_html);

$this->response->withStringBody($response_html);

 

CakePHP3開発のボス的存在である markstory がこれでいいってコメントしてるので、たぶんOKでしょう。同じところにハマってる方のお役に立てれば幸いです。

 

>> CakePHP3.4への移行ガイド(日本語)はコチラ

 

2022年9月13日追記

Yamamotoさんがコメントで教えてくださったように、

「Response::body() は非推奨です。代わりに Response::withStringBody() を使用してください。」

が正解です。僕が書いた元記事の打ち消し線部分は間違っていました。この記事を参考になさった方、すみません。そしてYamamotoさん、ご指摘ありがとうございます!

 

 

コメント

  1. Yamamoto より:

    初めまして。少し気になったので・・
    Markがそう言った2時間後に szel という人が
    「response::withString()ってのを作れば便利じゃない?」と提案して、
    その直後にlorenzo が「だったらwithStringBody()という名前にしよう」と
    同意し、その日のうちに採用されてます。
    なので、withStringBody()を使うのが正解かな?と思います。
    (公式ドキュメントにも書いてあります)

    レビュアーが「write()メソッドを使ってください」と言うので、
    「なんで?」と聞いたら当ブログの記事を示されました・・

    • かみおか管理人 より:

      コメントありがとうございます。Yamamotoさんがご指摘いただいた通りだと思います。記事についても修正させていただきました。コメントいただいてからGithubのやりとりを見に行ったんですが、この非推奨のメソッドについてCakePHP公式ドキュメントを修正されたのYamamotoさんなんですね!そのYamamotoさんに、こんな場末ブログ参照して「write()メソッドを使ってください」っていうレビュアーの方って・・・。まずは公式ドキュメントに当たる大切さを改めて教えられた気がしました。ホントにありがとうございました。

  2. Yamamoto より:

    きのう投稿したつもりでしたが投稿できてなかったみたいなので・・

    その直後のやりとりで「だったらwithStringBody()ってのを作ろう」という話になっていて、その日のうちに作られました。なのでwithStringBody()を使うのが正解だと思います。

    • かみおか管理人 より:

      コメントですが、僕が承認するまで表示されないようにしてます。二度も投稿させてしまってスミマセン。

タイトルとURLをコピーしました