CodeIgniterの学習 74 - dBugをCodeIgniter上で使いColdFusionのcfdump風に折りたたみ可能で見た目も綺麗なvar_dumpを表示出来るようにする
こんにちは!
今日はdBugをCodeIgniter上で使えるラッパーを作ってみる。
以前 のエントリー http://d.hatena.ne.jp/dix3/20081121/1227195464 (PEAR :: 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内で、
みたいに呼び出すようにしているので、このdebug_helper.php内にラッパーファンクションを追加した。
$autoload['helper'] = array('registry','url',(..snip..),'cmn','log','debug');
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;"> dBug('.$k.') </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とは違って深くネストしたオブジェクトでも落ちないみたい。
お試しあれ。