improved our debug class a lot

This commit is contained in:
Steffen Vogel 2010-07-20 21:27:53 +02:00
parent 096a2daaad
commit d167436ca7
6 changed files with 119 additions and 49 deletions

View file

@ -34,6 +34,8 @@ final class Dispatcher {
protected $view; // View
protected $controller; // Controller
protected $debug = NULL; // optional debugging instance
/*
* constructor
*/
@ -48,6 +50,12 @@ final class Dispatcher {
// initialize entity manager
$this->em = Dispatcher::createEntityManager();
// staring debugging
if (($request->getParameter('debug') && $request->getParameter('debug') > 0) || Util\Configuration::read('debug')) {
$this->debug = new Util\Debug($request->getParameter('debug'));
$this->em->getConnection()->getConfiguration()->setSQLLogger($this->debug);
}
// initialize view
if (in_array($format, array('png', 'jpeg', 'gif'))) {
$this->view = new View\JpGraph($request, $response, $format);
@ -80,6 +88,11 @@ final class Dispatcher {
$action = ($this->view->request->getParameter('action')) ? 'get' : $this->view->request->getParameter('action'); // default action
$this->controller->run($action); // run controllers actions (usually CRUD: http://de.wikipedia.org/wiki/CRUD)
if (Util\Debug::isActivated()) {
$this->view->addDebug($this->debug);
}
$this->view->render(); // render view & send http response
}
@ -104,11 +117,7 @@ final class Dispatcher {
$config->setProxyNamespace('Volkszaehler\Model\Proxies');
$config->setAutoGenerateProxyClasses(DEV_ENV == true);
$config->setSQLLogger(Util\Debug::getSQLLogger());
$em = \Doctrine\ORM\EntityManager::create(Util\Configuration::read('db'), $config);
return $em;
return \Doctrine\ORM\EntityManager::create(Util\Configuration::read('db'), $config);
}
}

View file

@ -22,7 +22,7 @@
namespace Volkszaehler\Util;
class Configuration {
static public $values = array(); // TODO protected
static protected $values = array();
static public function write($var, $value) {
if (!is_scalar($value) && !is_array($value)) {
@ -32,7 +32,7 @@ class Configuration {
$values =& self::$values;
$tree = explode('.', $var);
foreach ($tree as $part) {
$values =& $values[$part];
$values =& $values[$part]; // TODO array_merge_recursive()
}
$values = $value;

View file

@ -21,15 +21,89 @@
namespace Volkszaehler\Util;
class Debug {
private static $logger = NULL;
use Doctrine\DBAL\Logging;
class Debug implements Logging\SQLLogger {
protected static $instance = NULL;
static public function getSQLLogger() {
if (is_null(self::$logger)) {
self::$logger = new \Doctrine\DBAL\Logging\DebugStack();
protected $queries = array();
protected $messages = array();
protected $started; // holds timestamp of initialization, used later to return time of execution
protected $level;
/*
* constructor
*/
public function __construct($level) {
// taking timestamp to stop execution time
$this->created = microtime(true);
$this->level = $level;
if (!is_null(self::$instance)) {
throw new \Exception('debugging has already been started. please use the static functions!');
}
return self::$logger;
self::$instance = $this;
// assert options
assert_options(ASSERT_ACTIVE, true);
assert_options(ASSERT_BAIL, false);
assert_options(ASSERT_WARNING, false);
assert_options(ASSERT_CALLBACK, array($this, 'assertHandler'));
}
/*
* interface for doctrine's dbal sql logger
*/
function logSQL($sql, array $params = null) {
$this->queries[] = array('sql' => $sql, 'parameter' => $params);
}
static public function log($message) {
if (!is_null(self::$instance)) {
$trace = debug_backtrace();
self::$instance->messages[] = array(
'message' => $message,
'file' => $trace[0]['file'],
'line' => $trace[0]['line'],
'time' => date('r'),
'args' => array_slice($trace[0]['args'], 1),
'trace' => $trace
);
}
}
/*
* simple assertion passthrough for future improvements
*
* @todo check how should be en/disabled (options etc..)
*/
public static function assert($code) {
assert($code);
}
public function assertHandler($file, $line, $code) {
$trace = debug_backtrace();
$info = $trace[2];
$this->messages[] = array(
'message' => 'assertion failed: ' . $code,
'file' => $info['file'],
'line' => $info['line'],
'time' => date('r'),
'trace' => array_slice($trace, 2)
);
}
public static function isActivated() { return !is_null(self::$instance); }
public function getExecutionTime() { return round((microtime(true) - $this->created), 5); }
public function getQueries() { return $this->queries; }
public function getMessages() { return $this->messages; }
}
?>

View file

@ -62,7 +62,6 @@ abstract class Csv extends \Volkszaehler\View\View {
}
public function addDebug() {
$this->footer[] = 'time: ' . $this->getTime();
$this->footer[] = 'database: ' . Util\Configuration::read('db.driver');

View file

@ -39,19 +39,15 @@ abstract class Json extends \Volkszaehler\View\View {
}
public function render() {
parent::render();
// TODO solve rendering order problem
$json = json_encode($this->json);
if ($this->request->getParameter('debug')) {
echo self::format($json);
}
else {
echo $json;
if (Util\Debug::isActivated()) {
$json = self::format($json);
}
echo $json;
parent::render();
}
protected static function format($json) {
@ -104,21 +100,25 @@ abstract class Json extends \Volkszaehler\View\View {
return $formatted;
}
public function addDebug() {
$this->json['debug'] = array('time' => $this->getTime(),
'database' => array('driver' => Util\Configuration::read('db.driver'),
'queries' => Util\Debug::getSQLLogger()->queries)
public function addDebug(Util\Debug $debug) {
$this->json['debug'] = array(
'time' => $debug->getExecutionTime(),
'messages' => $debug->getMessages(),
'database' => array(
'driver' => Util\Configuration::read('db.driver'),
'queries' => $debug->getQueries()
)
);
}
public function addException(\Exception $exception) {
$this->json['exception'] = array('type' => get_class($exception),
'message' => $exception->getMessage(),
'code' => $exception->getCode(),
'file' => $exception->getFile(),
'line' => $exception->getLine(),
'trace' => $exception->getTrace()
$this->json['exception'] = array(
'type' => get_class($exception),
'message' => $exception->getMessage(),
'code' => $exception->getCode(),
'file' => $exception->getFile(),
'line' => $exception->getLine(),
'trace' => $exception->getTrace()
);
}
}

View file

@ -21,19 +21,16 @@
namespace Volkszaehler\View;
use Volkszaehler\Util;
abstract class View {
public $request;
protected $response;
private $created; // holds timestamp of creation, used later to return time of execution
public function __construct(Http\Request $request, Http\Response $response) {
$this->request = $request;
$this->response = $response;
// TODO move to Debug or State class
$this->created = microtime(true);
// error & exception handling by view
set_exception_handler(array($this, 'exceptionHandler'));
set_error_handler(array($this, 'errorHandler'));
@ -58,16 +55,7 @@ abstract class View {
die();
}
// TODO move this into Debug or State Class
protected function getTime() {
return round(microtime(true) - $this->created, 4);
}
public function render() {
if (!is_null($this->request->getParameter('debug')) && $this->request->getParameter('debug') > 0) {
$this->addDebug();
}
$this->response->send();
}
@ -75,7 +63,7 @@ abstract class View {
echo $e;
}
public function addDebug() {
public function addDebug(Util\Debug $debug) {
}
}