mirror of
https://github.com/maximebf/php-debugbar.git
synced 2025-01-17 13:28:35 +01:00
Added abstraction for HTTP features (fixed #28)
This commit is contained in:
parent
ba75ec7e66
commit
7e81754ef6
@ -40,6 +40,8 @@ class DebugBar implements ArrayAccess
|
|||||||
|
|
||||||
protected $storage;
|
protected $storage;
|
||||||
|
|
||||||
|
protected $httpDriver;
|
||||||
|
|
||||||
protected $stackSessionNamespace = 'PHPDEBUGBAR_STACK_DATA';
|
protected $stackSessionNamespace = 'PHPDEBUGBAR_STACK_DATA';
|
||||||
|
|
||||||
protected $stackAlwaysUseSessionStorage = false;
|
protected $stackAlwaysUseSessionStorage = false;
|
||||||
@ -163,6 +165,32 @@ class DebugBar implements ArrayAccess
|
|||||||
return $this->storage !== null;
|
return $this->storage !== null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the HTTP driver
|
||||||
|
*
|
||||||
|
* @param HttpDriverInterface $driver
|
||||||
|
*/
|
||||||
|
public function setHttpDriver(HttpDriverInterface $driver)
|
||||||
|
{
|
||||||
|
$this->httpDriver = $driver;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the HTTP driver
|
||||||
|
*
|
||||||
|
* If no http driver where defined, a PhpHttpDriver is automatically created
|
||||||
|
*
|
||||||
|
* @return HttpDriverInterface
|
||||||
|
*/
|
||||||
|
public function getHttpDriver()
|
||||||
|
{
|
||||||
|
if ($this->httpDriver === null) {
|
||||||
|
$this->httpDriver = new PhpHttpDriver();
|
||||||
|
}
|
||||||
|
return $this->httpDriver;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Collects the data from the collectors
|
* Collects the data from the collectors
|
||||||
*
|
*
|
||||||
@ -226,11 +254,14 @@ class DebugBar implements ArrayAccess
|
|||||||
}
|
}
|
||||||
$chunks[] = $data;
|
$chunks[] = $data;
|
||||||
|
|
||||||
|
$headers = array();
|
||||||
for ($i = 0, $c = count($chunks); $i < $c; $i++) {
|
for ($i = 0, $c = count($chunks); $i < $c; $i++) {
|
||||||
$name = $headerName . ($i > 0 ? "-$i" : '');
|
$name = $headerName . ($i > 0 ? "-$i" : '');
|
||||||
header("$name: {$chunks[$i]}");
|
$headers[$name] = $chunks[$i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->getHttpDriver()->setHeaders($headers);
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -239,7 +270,7 @@ class DebugBar implements ArrayAccess
|
|||||||
*/
|
*/
|
||||||
public function stackData()
|
public function stackData()
|
||||||
{
|
{
|
||||||
$this->initStackSession();
|
$http = $this->initStackSession();
|
||||||
|
|
||||||
$data = null;
|
$data = null;
|
||||||
if (!$this->isDataPersisted() || $this->stackAlwaysUseSessionStorage) {
|
if (!$this->isDataPersisted() || $this->stackAlwaysUseSessionStorage) {
|
||||||
@ -248,7 +279,9 @@ class DebugBar implements ArrayAccess
|
|||||||
$this->collect();
|
$this->collect();
|
||||||
}
|
}
|
||||||
|
|
||||||
$_SESSION[$this->stackSessionNamespace][$this->getCurrentRequestId()] = $data;
|
$stack = $http->getSessionValue($this->stackSessionNamespace);
|
||||||
|
$stack[$this->getCurrentRequestId()] = $data;
|
||||||
|
$http->setSessionValue($this->stackSessionNamespace, $stack);
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -259,8 +292,8 @@ class DebugBar implements ArrayAccess
|
|||||||
*/
|
*/
|
||||||
public function hasStackedData()
|
public function hasStackedData()
|
||||||
{
|
{
|
||||||
$this->initStackSession();
|
$http = $this->initStackSession();
|
||||||
return count($_SESSION[$this->stackSessionNamespace]) > 0;
|
return count($http->getSessionValue($this->stackSessionNamespace)) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -271,10 +304,10 @@ class DebugBar implements ArrayAccess
|
|||||||
*/
|
*/
|
||||||
public function getStackedData($delete = true)
|
public function getStackedData($delete = true)
|
||||||
{
|
{
|
||||||
$this->initStackSession();
|
$http = $this->initStackSession();
|
||||||
$stackedData = $_SESSION[$this->stackSessionNamespace];
|
$stackedData = $http->getSessionValue($this->stackSessionNamespace);
|
||||||
if ($delete) {
|
if ($delete) {
|
||||||
unset($_SESSION[$this->stackSessionNamespace]);
|
$http->deleteSessionValue($this->stackSessionNamespace);
|
||||||
}
|
}
|
||||||
|
|
||||||
$datasets = array();
|
$datasets = array();
|
||||||
@ -335,17 +368,21 @@ class DebugBar implements ArrayAccess
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Initializes the session for stacked data
|
* Initializes the session for stacked data
|
||||||
|
*
|
||||||
|
* @return HttpDriverInterface
|
||||||
*/
|
*/
|
||||||
protected function initStackSession()
|
protected function initStackSession()
|
||||||
{
|
{
|
||||||
if (!isset($_SESSION)) {
|
$http = $this->getHttpDriver();
|
||||||
|
if (!$http->isSessionStarted()) {
|
||||||
throw new DebugBarException("Session must be started before using stack data in the debug bar");
|
throw new DebugBarException("Session must be started before using stack data in the debug bar");
|
||||||
}
|
}
|
||||||
|
|
||||||
$ns = $this->stackSessionNamespace;
|
if (!$http->hasSessionValue($this->stackSessionNamespace)) {
|
||||||
if (!isset($_SESSION[$ns])) {
|
$http->setSessionValue($this->stackSessionNamespace, array());
|
||||||
$_SESSION[$ns] = array();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return $http;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
63
src/DebugBar/HttpDriverInterface.php
Normal file
63
src/DebugBar/HttpDriverInterface.php
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* This file is part of the DebugBar package.
|
||||||
|
*
|
||||||
|
* (c) 2013 Maxime Bouroumeau-Fuseau
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace DebugBar;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides an abstraction of PHP native features for easier integration
|
||||||
|
* in third party frameworks
|
||||||
|
*/
|
||||||
|
interface HttpDriverInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Sets HTTP headers
|
||||||
|
*
|
||||||
|
* @param string $headers
|
||||||
|
*/
|
||||||
|
function setHeaders(array $headers);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if the session is started
|
||||||
|
*
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
function isSessionStarted();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets a value in the session
|
||||||
|
*
|
||||||
|
* @param string $name
|
||||||
|
* @param string $value
|
||||||
|
*/
|
||||||
|
function setSessionValue($name, $value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if a value is in the session
|
||||||
|
*
|
||||||
|
* @param string $name
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
function hasSessionValue($name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a value from the session
|
||||||
|
*
|
||||||
|
* @param string $name
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
function getSessionValue($name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes a value from the session
|
||||||
|
*
|
||||||
|
* @param string $name
|
||||||
|
*/
|
||||||
|
function deleteSessionValue($name);
|
||||||
|
}
|
67
src/DebugBar/PhpHttpDriver.php
Normal file
67
src/DebugBar/PhpHttpDriver.php
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* This file is part of the DebugBar package.
|
||||||
|
*
|
||||||
|
* (c) 2013 Maxime Bouroumeau-Fuseau
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace DebugBar;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HTTP driver for native php
|
||||||
|
*/
|
||||||
|
class PhpHttpDriver implements HttpDriverInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
function setHeaders(array $headers)
|
||||||
|
{
|
||||||
|
foreach ($headers as $name => $value) {
|
||||||
|
header("$name: $value");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
function isSessionStarted()
|
||||||
|
{
|
||||||
|
return isset($_SESSION);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
function setSessionValue($name, $value)
|
||||||
|
{
|
||||||
|
$_SESSION[$name] = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
function hasSessionValue($name)
|
||||||
|
{
|
||||||
|
return array_key_exists($name, $_SESSION);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
function getSessionValue($name)
|
||||||
|
{
|
||||||
|
return $_SESSION[$name];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
function deleteSessionValue($name)
|
||||||
|
{
|
||||||
|
unset($_SESSION[$name]);
|
||||||
|
}
|
||||||
|
}
|
@ -54,20 +54,29 @@ class DebugBarTest extends DebugBarTestCase
|
|||||||
$this->assertEquals($s->data[$this->debugbar->getCurrentRequestId()], $data);
|
$this->assertEquals($s->data[$this->debugbar->getCurrentRequestId()], $data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testSendDataInHeaders()
|
||||||
|
{
|
||||||
|
$http = $this->debugbar->getHttpDriver();
|
||||||
|
$this->debugbar->addCollector($c = new MockCollector(array('foo')));
|
||||||
|
|
||||||
|
$this->debugbar->sendDataInHeaders();
|
||||||
|
$this->assertArrayHasKey('phpdebugbar', $http->headers);
|
||||||
|
}
|
||||||
|
|
||||||
public function testStackedData()
|
public function testStackedData()
|
||||||
{
|
{
|
||||||
$_SESSION = array();
|
$http = $this->debugbar->getHttpDriver();
|
||||||
$this->debugbar->addCollector($c = new MockCollector(array('foo')));
|
$this->debugbar->addCollector($c = new MockCollector(array('foo')));
|
||||||
$this->debugbar->stackData();
|
$this->debugbar->stackData();
|
||||||
|
|
||||||
$this->assertArrayHasKey($ns = $this->debugbar->getStackDataSessionNamespace(), $_SESSION);
|
$this->assertArrayHasKey($ns = $this->debugbar->getStackDataSessionNamespace(), $http->session);
|
||||||
$this->assertArrayHasKey($id = $this->debugbar->getCurrentRequestId(), $_SESSION[$ns]);
|
$this->assertArrayHasKey($id = $this->debugbar->getCurrentRequestId(), $http->session[$ns]);
|
||||||
$this->assertArrayHasKey('mock', $_SESSION[$ns][$id]);
|
$this->assertArrayHasKey('mock', $http->session[$ns][$id]);
|
||||||
$this->assertEquals($c->collect(), $_SESSION[$ns][$id]['mock']);
|
$this->assertEquals($c->collect(), $http->session[$ns][$id]['mock']);
|
||||||
$this->assertTrue($this->debugbar->hasStackedData());
|
$this->assertTrue($this->debugbar->hasStackedData());
|
||||||
|
|
||||||
$data = $this->debugbar->getStackedData();
|
$data = $this->debugbar->getStackedData();
|
||||||
$this->assertArrayNotHasKey($ns, $_SESSION);
|
$this->assertArrayNotHasKey($ns, $http->session);
|
||||||
$this->assertArrayHasKey($id, $data);
|
$this->assertArrayHasKey($id, $data);
|
||||||
$this->assertEquals(1, count($data));
|
$this->assertEquals(1, count($data));
|
||||||
$this->assertArrayHasKey('mock', $data[$id]);
|
$this->assertArrayHasKey('mock', $data[$id]);
|
||||||
@ -76,14 +85,13 @@ class DebugBarTest extends DebugBarTestCase
|
|||||||
|
|
||||||
public function testStackedDataWithStorage()
|
public function testStackedDataWithStorage()
|
||||||
{
|
{
|
||||||
$_SESSION = array();
|
$http = $this->debugbar->getHttpDriver();
|
||||||
$s = new MockStorage();
|
$this->debugbar->setStorage($s = new MockStorage());
|
||||||
$this->debugbar->setStorage($s);
|
|
||||||
$this->debugbar->addCollector($c = new MockCollector(array('foo')));
|
$this->debugbar->addCollector($c = new MockCollector(array('foo')));
|
||||||
$this->debugbar->stackData();
|
$this->debugbar->stackData();
|
||||||
|
|
||||||
$id = $this->debugbar->getCurrentRequestId();
|
$id = $this->debugbar->getCurrentRequestId();
|
||||||
$this->assertNull($_SESSION[$this->debugbar->getStackDataSessionNamespace()][$id]);
|
$this->assertNull($http->session[$this->debugbar->getStackDataSessionNamespace()][$id]);
|
||||||
|
|
||||||
$data = $this->debugbar->getStackedData();
|
$data = $this->debugbar->getStackedData();
|
||||||
$this->assertEquals($c->collect(), $data[$id]['mock']);
|
$this->assertEquals($c->collect(), $data[$id]['mock']);
|
||||||
|
@ -10,6 +10,7 @@ abstract class DebugBarTestCase extends \PHPUnit_Framework_TestCase
|
|||||||
public function setUp()
|
public function setUp()
|
||||||
{
|
{
|
||||||
$this->debugbar = new DebugBar();
|
$this->debugbar = new DebugBar();
|
||||||
|
$this->debugbar->setHttpDriver($http = new MockHttpDriver());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function assertJsonIsArray($json)
|
public function assertJsonIsArray($json)
|
||||||
|
44
tests/DebugBar/Tests/MockHttpDriver.php
Normal file
44
tests/DebugBar/Tests/MockHttpDriver.php
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace DebugBar\Tests;
|
||||||
|
|
||||||
|
use DebugBar\HttpDriverInterface;
|
||||||
|
|
||||||
|
class MockHttpDriver implements HttpDriverInterface
|
||||||
|
{
|
||||||
|
public $headers = array();
|
||||||
|
|
||||||
|
public $sessionStarted = true;
|
||||||
|
|
||||||
|
public $session = array();
|
||||||
|
|
||||||
|
function setHeaders(array $headers)
|
||||||
|
{
|
||||||
|
$this->headers = array_merge($this->headers, $headers);
|
||||||
|
}
|
||||||
|
|
||||||
|
function isSessionStarted()
|
||||||
|
{
|
||||||
|
return $this->sessionStarted;
|
||||||
|
}
|
||||||
|
|
||||||
|
function setSessionValue($name, $value)
|
||||||
|
{
|
||||||
|
$this->session[$name] = $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
function hasSessionValue($name)
|
||||||
|
{
|
||||||
|
return array_key_exists($name, $this->session);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSessionValue($name)
|
||||||
|
{
|
||||||
|
return $this->session[$name];
|
||||||
|
}
|
||||||
|
|
||||||
|
function deleteSessionValue($name)
|
||||||
|
{
|
||||||
|
unset($this->session[$name]);
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user