[CakePHP3] デバッガがFatal Errorを吐くときはdebug_kitのバージョンを変えてみよう

jQueryとPHPの基礎を一通り勉強し直したので、Webサービスを作るべくCakePHPに手を出しております。この2日間どっぷりやってました。端的に言って、CakePHP、楽しい!

のですが、デバッガがエラーを吐いてデバッグどころじゃないという、なんだかなあ、なことが起こったので、メモ。


スポンサーリンク

1.エラー内容

まずはどんなエラーが起こったかを紹介します。

1-1.インストール時に出ていたエラー

今回のFatal Errorの前に、インストール時からデバッガはFatal Errorを吐きやがりました。

20170116_01

よっしゃCakePHPやるぞー!と意気込んで、CakePHP3 ビギナーズガイド: 最新のPHPフレームワークをマスターせよ! という本のKindle版を参考に、composerでCakePHP3をインストール→内蔵サーバを起動→トップページ表示!というタイミングでエラー。本に書いてあることと違うー!って半泣きになりましたよね。

エラー内容は以下のとおりです。

Fatal Error: Call to undefined method Cake\Responce::getBody() in [CakeのROOT]\vendor\cakephp\debug_kit\src\ToolbarService.php on line 213

まだわしなんもコード書いてねえぞ??と思いながら検索したところ、同じ事例を発見。

CakePHP3でFriendsOfCakeのインストール時エラー

先人ありがとうございます…ということで、Debug Kitをダウングレードし、このエラーは回避できました(ダウングレードの方法はあとで書きます)。

1-2.今回起きたエラー

その後特に深刻なことはなく、 CakePHP3 ビギナーズガイド: 最新のPHPフレームワークをマスターせよ! の仰る通りにせかせか基礎を学んでいきました。宣伝ですけど、この本、CakePHP3初心者にはとてもわかりやすいです。オブジェクト指向プログラミングとSQLの知識はある程度持っていること前提な感じはしますが、この土日でほぼ一通り終わり、なんとなくCakePHPがどんなものかを理解することができました。

で、ですよ。パチパチコードを打っていた内容が、実はbakeって飛び道具で一気にビルドできるんだぜー!という段に差し掛かり、まじか!やるわ!ってやったんですよ。一気に。bake allを各テーブルに、一気に

そしたらなんだかこんなことになりました。

20170116_01

\(^o^)/

CakePHPではDB設計に色んな規約があることも知らず、順番も何も考えずbakeした私が悪いのは悪いんです。賞味期限の切れた材料ぶっこんで焼いてもそりゃ美味しいケーキにはなりませんよ、という話で。

でもこのエラー、コードの間違った箇所でなくて、デバッガのエラーだったんですね。つまり、エラーをキャッチしてエラー内容を表示してくれようとするプロセスでのエラー。こっちの何が間違っているのかわからない。デバッガがエラー。しかもServer Error 500に匹敵する憎きFatal Error。辛ぇわ。

またまた半泣きになっていたところ、Twitterでつぶやくと親切な方が声をかけてくださりました。別の意味で泣きそうになりました。

エラー内容を見ていただき、やっぱりデバッガのエラーらしいこと、本来は例外オブジェクトが入るはずの変数$errorに文字列が入ってしまっているらしいことを教えていただきました。

Error: Call to a member function getTrace() on string
File: CakeのROOT\vendor\cakephp\cakephp\src\Template\Elements\exception_stack_trace.ctp
Line:21

これですね。

ちなみに上のエラー画像が写真なのは、テンパってスクショでなく写メったからです。テンパって修正もなんもしてなくて、開発フォルダをOneDriveに置いているので、Microsoftアカウントが丸出しになっており、該当ツイートは消しました。すみません…。

2.対処方法

「デバッガのエラー」で思い出しました。そういやインストール直後にdebug_kitのダウングレードしてたな?と。ほんの1、2日前の出来事をすっかり忘れておりました。老いでしょうか。

もしかして…と思って、今度はdebug_kitのアップグレードを行いました。最新バージョンだとエラーが出てたので、その手前くらい。

すると、出なくなったんです、Fatal Error!その代わりアソシエーション関係のエラーがこれでもかというほど出るようになりましたwそっちに関してはいずれ別に書きたいと思います。思考停止のbake all、ダメ、ゼッタイ。

各対処時のdebug_kitのバージョンは以下の通りです。CakePHPのバージョンは3.3.12です。ただ、最初にdebug_kitをダウングレードしたタイミングでCakeのバージョンが上がったので、最初にインストールしたときはもう少しバージョンが低かったかもしれません。

  • インストール時:3.5.1(おそらく)
  • 初回エラー後~今回エラーまで:3.0.2(なんでそこまで下げた)
  • 今回エラー後:3.2.9(間をとってみた)

経験則でしかありませんが、今のところCakePHP 3.3.12+debug_kit 3.2.9だと元気に動いている、という次第です。


スポンサーリンク

3.debug_kitのバージョンを変更する方法

PHPはwordpressカスタマイズかコア機能だけのベタ書きしかしたことのない私、もちろんcomposerを使うのも初めてでした。debug_kitをダウングレードすればいいよ!と見かけても、ダウングレードってどうやんのレベルでした生きててすみません。

自分のためにもやり方を書いておきます。もしもっとスマートなやり方(たとえばdebug_kitのバージョンだけを変えるやり方)があれば誰か教えてください。。

3-1.アップグレードの場合

アップグレードは簡単です。CakePHPのルートフォルダにあるcomposer.jsonの下記記述を、最新っぽいバージョンに変えます。

"require-dev": {
  "psy/psysh": "@stable",
  "cakephp/debug_kit": "~3.2.0", ←ここをアップグレードしたいバージョンに変える
  "cakephp/bake": "~1.1"
  },

そして、コマンドプロンプト(またはコンソール)から、composerのupdateコマンドを打ちます。

$ composer update

3-2.ダウングレードの場合

ダウングレードはちょっと面倒くさいです。composer.jsonを変更するまでは同じ。

"require-dev": {
  "psy/psysh": "@stable",
  "cakephp/debug_kit": "~3.2.0", ←ここをダウングレードしたいバージョンに変える
  "cakephp/bake": "~1.1"
  },

これでcomposerをupdate…とはいきません。より新しいdebug_kitが残ったままだと怒られます。

……って、怒られたことがあるのですが、今エラーメッセージを拾ってこようと実際にやってみると普通に通りました……なんやねん……。

どうやら怒られることもあれば怒られないこともあるようなので、もし怒られたときの対処法です。debug_kitのフォルダをどこかへ退避します。debug_kitの場所は以下の通り。

CakeのROOT\vendor\cakephp\debug_kit

こいつをどこかに退避してやれば、ストンと落ちてきます。めでたしめでたし。

デバッガは正常に動くようになったし、大量のアソシエーションエラーもDB構造見直して慎重にbakeしたら出なくなったので、引き続きCakePHP楽しみます!!

この投稿の投稿者は おさみ です。ブックマーク用 パーマリンク

スポンサーリンク