CakePHP3でよく使うデバッグコードといえばpr()や$this->log()。だが、デバッグしたい箇所によってはこれが使えない場合もある。今回は筆者の経験上
「こういう時はこのデバッグコードを使うのが鉄板!」
と思われるデバッグコードを紹介する。検証したCakePHPのバージョンは3.6.13。
万能系デバッグはdebug(), dd()を活用しよう
変数の中身を画面に出力してくれるデバッグ用関数はいくつかあるが、その中でもCakeが準備しているdebug()とdd()がおすすめだ。以下で詳細に解説する。
debug()の特長
debug()は渡された変数の中身を整形して出力してくれるだけでなく、変数内のデータの型まで出力してくれるのが魅力。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php $hoge = [ 0 => 'hoge', 1 => 'hogehoge', 2 => 'hogehogehoge' ]; debug($hoge); exit; ?> // 出力結果 /config/bootstrap.php (line 222) [ (int) 0 => 'hoge', (int) 1 => 'hogehoge', (int) 2 => 'hogehogehoge' ] |
↑こんな感じ。pr()だとデータ型までは出力してくれないので、型まで確認したいニーズに答えるにはdebug()のほうが良い。
dd()の特長
他方、dd()は出力内容自体はpr()と同じだが、pr()とdie()を両方兼ね備えているのでわざわざ処理を止めるためexit;等を書く必要がないのと、ddとだけ書けばすぐにデバッグできる手軽さが魅力。
1 2 3 4 5 6 7 8 9 10 11 |
<?php $hoge = [ 0 => 'hoge', 1 => 'hogehoge', 2 => 'hogehogehoge' ]; dd($hoge); ?> |
出力結果:
↑こんな感じ。pr()と違うこととしてはカラーリングが適用されてたり、▼マークで中身展開ができる。
大抵の場合、ここまでに解説した2つのデバッグ方法でほぼ全てのニーズを満たせる。両者共にShellの中でも出力可能だ。ただし、以下で解説するindex.phpやbootstrap.phpの一部箇所、そして後述するAjax通信においてはdebug(), dd()が使用できないので、別方法を検討する必要がある。
debug(), dd()が使用できない箇所
src配下であれば全ての箇所で使うこと可能だが、webroot配下のidnex.phpやconfig配下のbootstrap.php(一部の箇所)では使用できない。より詳細に解説すると、bootstrap.phpに記述されている
1 |
require CORE_PATH . 'config' . DS . 'bootstrap.php'; |
と、app.phpに記述されている
1 |
'debug' => filter_var(env('DEBUG', true), FILTER_VALIDATE_BOOLEAN), |
のConfigure::read(‘debug’)を1に設定する記載を読み込まない限り、debug()もdd()も使えないので注意。それより以前の箇所でデバッグしたい場合は、素直にPHPのピュアなデバッグに頼ることになる。
ピュアPHPによるおすすめデバッグ方法
おすすめは
1 2 3 4 5 6 |
<?php print_r('<pre>'); var_dump($hoge); print_r('</pre>'); exit; ?> |
のように、var_dump()を整形した状態で出力できるように書くこと。そうすることで、下記のような出力が得られる:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php $hoge = [ 0 => 'hoge', 1 => 'hogehoge', 2 => 'hogehogehoge' ]; print_r('<pre>'); var_dump($hoge); print_r('</pre>'); exit; ?> // 出力結果 array(3) { [0]=> string(4) "hoge" [1]=> string(8) "hogehoge" [2]=> string(12) "hogehogehoge" } |
フレームワークに頼れない場合は、原始的なデバッグをするのが吉。
JavaScriptからAjax通信でCake側の処理を呼び出された場合のデバッグ方法
実は困ったことに、AjaxでCake側の処理を呼び出された際にdebug(), dd()を仕込んでも出力してくれない。この場合はデバッグ内容をログに書き出させる必要がある。
よく使うことが多いのは$this->log()。だが$this->log()はModel配下等で一部使えない箇所があるため、万能なログ出力をするのであれば\Cake\Log\Log::debug()がおすすめ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php $hoge = [ 0 => 'hoge', 1 => 'hogehoge', 2 => 'hogehogehoge' ]; \Cake\Log\Log::debug($hoge); exit; ?> // ログ出力結果 ==> debug.log <== 2020-01-01 10:22:24 Debug: Array ( [0] => hoge [1] => hogehoge [2] => hogehogehoge ) |
ただ、ちょっと長いのであまり書きたくないかも。。万能ではあるのだけど。個人的には結果的に$this->log()と\Cake\Log\Log::debug()をシーン毎に使い分けているのが現状。他に万能なログデバッグ方法があったら教えてくださいませ。
参考)
https://hacknote.jp/archives/26769/