search
LoginSignup
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('メッセージ');

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
20
Help us understand the problem. What are the problem?