20
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

【CakePHP】printfデバッグ用のメソッドまとめ

CakePHPでのprintfデバッグで使えるメソッドをまとめる。

画面に出力

phpのvar_dump()やprint_r()はpreタグをつけないと配列やオブジェクトの結果が見づらいが、CakePHPのdebug()やpr()ならpreタグ付きで出力されるので見やすい。

出力するメッセージは文字列(数値)、配列、オブジェクトなんでもOK。

1.debug()

debug('メッセージ');

また、第三引数にtrueを渡すとバッグトレース付きで出力してくれる。

debug('メッセージ',null,true);

app/Config/core.phpのdebugが0(本番モード)の場合、出力されない。
そのため、var_dump()などに比べソースの中にdebug()を消し忘れて本番で表示されてしまう心配がない。(もちろん消し忘れはだめだけど。)
逆にdebug()しても出ない場合は、debugが0でないか確認すること。

2.pr()
print_r()の短縮形。print_r()に比べてpreタグ出るし、書くの楽。

pr('メッセージ');

ログに出力

ログをapp/tmp/logs/error.logに出力してくれる。
ログファイルをtailfしながらデバッグする。

出力するメッセージは文字列(数値)、配列、オブジェクトなんでもOK。

1.$this->log()
Cakeで用意されているクラスの大本に定義されているので、どこからでも呼ぶことができる。

$this->log('メッセージ');

自分の環境では、$this->log()の結果に実行ファイルと行番号が出すためCakeに手を加えている。

ファイル:lib/Cake/Core/Object.php
※直接修正するより、appの下に同じファイル作ってオーバーライドする方法の方がいいのか??指摘頂けるとありがたいです。

※行番号とファイルの取得はググった結果を組み合わせて書いてるけど、もっとシンプルな書きかたがあるような気がしていて、こういうのあるよというのがあれば教えて頂けるとありがたいです。

public function log($msg, $type = LOG_ERR, $scope = null) {
  if (!is_string($msg)) {
    $msg = print_r($msg, true);

    //追加部分 start
    //デフォルトのログのみを対象にするため。
    if($type === LOG_ERR){
      //ファイル取得
      $trace = Debugger::trace(array('start' => 1, 'depth' => 2, 'format' => 'array'));
      $file = str_replace(array(CAKE_CORE_INCLUDE_PATH, ROOT), '', $trace[0]['file']);
      //行番号取得
      $line = $trace[0]['line'];
      //メッセージ作成
      $lineInfo = sprintf('%s (line %s)', $file, $line);
      $msg = "{$lineInfo} $msg";
    }
    //追加部分 end
  }

  return CakeLog::write($type, $msg, $scope);
}

2.LogError()

LogError('メッセージ');
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
20
Help us understand the problem. What are the problem?