CodeIgniterの学習 74 - dBugをCodeIgniter上で使いColdFusionのcfdump風に折りたたみ可能で見た目も綺麗なvar_dumpを表示出来るようにする

こんにちは!

今日はdBugをCodeIgniter上で使えるラッパーを作ってみる。


以前 のエントリー http://d.hatena.ne.jp/dix3/20081121/1227195464PEAR :: Var_Dumpを使ってプロファイラにvar_dump情報を整形して吐く俺俺ヘルパを作る )で、

既に見た目が綺麗なvar_dumpを実現していたが、今回はPEARを使わない版。


ColdFusionでお世話になっていたcfdumpのPHP版みたいなやつ。(さくっと画面が作れてColdFusionもいいよー)


dBugの紹介記事はこちらの中 - http://www.smashingmagazine.com/2009/01/20/50-extremely-useful-php-tools/
本家はこちら - http://dbug.ospinto.com/

かなり昔に気になってたのだが、開発の息抜きにCodeIgniterで使えるようにしてみた。

画面

こんな感じ。
適当なコントローラーとかで、

 dBug($this->form_validation);
 dBug($this->session);

みたいに呼び出すと、



てなかんじで、プロファイラ上にdBugの結果を表示する事が出来る。
各セルは折りたたみ可能。
呼び出し元のファイル名・行番号・メソッド名もついでに表示する様にしている。

見た目も綺麗で直感的で良い感じ。


設置方法

以下の通り

手順1:元ソースの取得
dBugを http://dbug.ospinto.com/ から ダウンロードして、dBug.php を application/libraries/dBug.phpとして設置する。



手順2:ワーニングが出ないように部分修正
application/libraries/dBug.phpの104行目付近

return $arrMatches[1];

return isset($arrMatches[1]) ? $arrMatches[1] : '';

に変更する。



手順3:dBugを呼び出すラッパーを作る

俺の開発環境では、
俺俺デバッグ関連用ヘルパーを、
application/helpers/debug_helper.php
として作り、

application/config/autoload.php内で、


$autoload['helper'] = array('registry','url',(..snip..),'cmn','log','debug');
みたいに呼び出すようにしているので、このdebug_helper.php内にラッパーファンクションを追加した。


application/helpers/debug_helper.phpの一部:

<?php

//snip

if ( ! function_exists( 'dBug' ) ) {
  // dBug wrapper ( see:http://dbug.ospinto.com)
  function dBug( $data )
  {
    $trace =  debug_backtrace();
    $fname = ( isset( $trace[0]['file'] ) ) ? $trace[0]['file'] : '';
    $line = ( isset( $trace[0]['line'] ) ) ? $trace[0]['line'] : '';
    $func = ( isset( $trace[1]['function'] ) ) ? $trace[1]['function'] : '';
    ob_start();
    new dBug($data);
    $output = ob_get_contents(); 
    ob_end_clean();
    $CI = &get_instance();
    if ( !isset( $CI -> dBug_data) || !is_array( $CI -> dBug_data) ) {
      $CI -> dBug_data= array();
    }
    $CI -> dBug_data['FILE:' . $fname . ' LINE:' . $line . ' FUNCTION:' . $func] = $output;
  }
}

//snip

?>

debug_backtraceで、呼び出し元情報を取得

$output に、dBugの結果を貯め込み

$CI -> dBug_data に保存している。

(後でプロファイラに渡せるように$CI内にdBug_dataを勝手に追加してる。)



手順4:application/libraries/MY_Profiler.php の改造

プロファイラの改造等々については、
以前のエントリー
http://d.hatena.ne.jp/dix3/20081016/1224124127 (CodeIgniterの学習 22 - 開発用のプロファイラを拡張し、db_sessionの情報を表示する)

http://d.hatena.ne.jp/dix3/20081005/1223161593 (CodeIgniterの学習 16 - 開発時にプロファイラを有効にし情報を表示する)
も参考にしてください。


(余談ですが、CodeIgniter1.7.0からは、CI標準のsessionライブラリで、db_sessionと同等の事が出来ます。たまにsession周りで誤解されているっぽいのを見かけるので一応。CI標準のSession.phpでクッキー保存方式・DB保存方式が選択できる。PHP標準の$_SESSION保存方式は別ライブラリが必要)



以下のソースでは、今回のdbug以外の改造部分(_compile_vd(),_compile_session()等)はとり除いています。
application/libraries/MY_Profiler.php

<?php if ( ! defined( 'BASEPATH' ) ) exit( 'No direct script access allowed' );
class MY_Profiler extends CI_Profiler {
  function MY_Profiler()
  {
    parent :: CI_Profiler();
  }

  // dBug
  function _compile_dbug()
  {
    $output = "\n\n";
    if ( isset( $this -> CI -> dBug_data) && is_array( $this -> CI -> dBug_data) ) {      
      $output .= "\n";
      foreach( $this -> CI -> dBug_data as $k => $v ) {
        $output .= '<fieldset style="border:1px solid #339900;padding:6px 10px 10px 10px;margin:20px 0 20px 0;background-color:#eee">';
        $output .= '<legend style="color:#339900;">&nbsp;&nbsp;dBug('.$k.')&nbsp;&nbsp;</legend>';
        $output .= "\n";
        $output .= $v ;
        $output .= '</fieldset>';
        $output .= "\n";
      }
    }
    return $output;
  }

  function run()
  {
    $output = '<br clear="all" />';
    $output .= "<div style='background-color:#fff;padding:3px 10px;'>";
    #$output .= $this -> _compile_vd();
    $output .= $this -> _compile_dbug();// dBug
    $output .= $this -> _compile_uri_string();
    $output .= $this -> _compile_controller_info();
    $output .= $this -> _compile_memory_usage();
    $output .= $this -> _compile_benchmarks();
    #$output .= $this -> _compile_session();
    $output .= $this -> _compile_get();
    $output .= $this -> _compile_post();
    #$output .= $this -> _compile_cookie();
    $output .= $this -> _compile_queries();
    #$output .= $this -> _compile_queries_subdb();
    #$output .= $this -> _compile_misc();
    $output .= '</div>';
    return $output;
  }
}
// END CI_Profiler class
/**
 * End of file MY_Profiler.php
 */
/**
 * Location: ./application/libraries/MY_Profiler.php
 */

?>

ちなみに現在の環境は、CodeIgniter1.7.1です。





手順5:プロファイラを有効にしてdBugを動かしてみる

http://d.hatena.ne.jp/dix3/20081005/1223161593 の様な方法で開発時にプロファイラを有効にし、
任意のソース内で、

 dBug($this->form_validation);
 dBug($this->session);
 dBug($hoge);

等呼び出してみると、上の画面の様にダンプデータが視覚化される。


めでたしめでたし。


dBugは、PEAR::Var_dumpとは違って深くネストしたオブジェクトでも落ちないみたい。
お試しあれ。