While doing some more development for Crindigan, I figured I should be looking for a better way to show debug information than putting it in the page footer, so I looked at FirePHP. Unfortunately the Firephp log adapter in Solar was out of date, so I wrote a quick adapter that uses the newer Wildfire protocol.
/**
* Log adapter that works with the latest FirePHP version
* (probably not FireConsole though, whenever it's released).
*
* @package Crindigan
* @author Steven Harris
* @license http://opensource.org/licenses/bsd-license.php BSD
* @version $Id$
*/
class Rpg_Log_Adapter_Wildfire extends Solar_Log_Adapter {
/**
* Default configuration values.
*
* @config string|array events The event types this instance
* should recognize; a comma-separated string of events, or
* a sequential array. Default is all events ('*').
*
* @config dependency response A Solar_Http_Response dependency injection.
*
* @var array
*
*/
protected $_Rpg_Log_Adapter_Wildfire = array(
'events' => '*',
'response' => 'response',
);
/**
* The Solar_Http_Response where headers will be sent.
*
* @var Solar_Http_Response
*/
protected $_response;
/**
* The Solar_Json instance used to encode JSON for Wildfire.
*
* @var Solar_Json
*/
protected $_json;
/**
* Wildfire header index to keep headers in sequential order.
*
* @var int
*/
protected $_index = 0;
/**
* Post-construction tasks. Sets up the response, JSON, and default Wildfire headers.
*/
protected function _postConstruct() {
parent::_postConstruct();
$this->_response = Solar::dependency('Solar_Http_Response', $this->_config['response']);
$this->_json = Solar::factory('Solar_Json');
$this->_response->setHeader('X-Wf-Protocol-1', 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2');
$this->_response->setHeader('X-Wf-1-Plugin-1', 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3');
$this->_response->setHeader('X-Wf-1-Structure-1', 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1');
}
/**
* Writes the log message to FirePHP.
*
* @param string $class Class name.
* @param string $event Event name.
* @param mixed $descr Log data. Any data type should work, assuming it can be encoded as JSON.
* @return bool Always true.
*/
protected function _save($class, $event, $descr) {
$meta = array();
$meta['Type'] = 'LOG';
$meta['Label'] = "$class-$event";
$data = $this->_json->encode(array($meta, $descr));
$len = strlen($data);
if ( strlen($data) <= 4990 ) {
$this->_index++;
$this->_response->setHeader("X-Wf-1-1-1-{$this->_index}", "$len|$data|");
} else {
$chunks = chunk_split($data, 4990, "\n");
$parts = explode("\n", $chunks);
$num_parts = count($parts);
for ( $i = 0; $i < $num_parts; $i++ ) {
$this->_index++;
$this->_response->setHeader("X-Wf-1-1-1-{$this->_index}",
($i == 0 ? $len : '') . "|{$parts[$i]}|" . (($i == $num_parts - 1) ? '' : '\\'));
}
}
return true;
}
}