49 'PHPUnit_Framework_MockObject_InvocationMocker',
50 'TYPO3\\CMS\\Extbase\\Persistence\\Generic\\IdentityMap',
51 'TYPO3\\CMS\\Extbase\\Reflection\\ReflectionService',
52 'TYPO3\\CMS\\Extbase\\Object\\ObjectManager',
53 'TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Mapper\\DataMapper',
54 'TYPO3\\CMS\\Extbase\\Persistence\\Generic\\PersistenceManager',
55 'TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Qom\\QueryObjectModelFactory',
56 'TYPO3\\CMS\\Frontend\\ContentObject\\ContentObjectRenderer' 86 self::$renderedObjects = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
98 static protected function renderDump($value, $level, $plainText, $ansiColors) {
100 if (is_string($value)) {
101 $croppedValue = strlen($value) > 2000 ? substr($value, 0, 2000) .
'...' : $value;
103 $dump = self::ansiEscapeWrap((
'"' . implode((PHP_EOL . str_repeat(self::PLAINTEXT_INDENT, ($level + 1))), str_split($croppedValue, 76)) .
'"'),
'33', $ansiColors) .
' (' . strlen($value) .
' chars)';
105 $dump = sprintf(
'\'<span
class=
"debug-string">%s</span>\
' (%s chars)', implode(
'<br />' . str_repeat(self::HTML_INDENT, ($level + 1)), str_split(htmlspecialchars($croppedValue), 76)), strlen($value));
107 } elseif (is_numeric($value)) {
108 $dump = sprintf(
'%s (%s)', self::ansiEscapeWrap($value,
'35', $ansiColors), gettype($value));
109 } elseif (is_bool($value)) {
110 $dump = $value ? self::ansiEscapeWrap(
'TRUE',
'32', $ansiColors) : self::ansiEscapeWrap(
'FALSE',
'32', $ansiColors);
111 } elseif (is_null($value) || is_resource($value)) {
112 $dump = gettype($value);
113 } elseif (is_array($value)) {
114 $dump = self::renderArray($value, $level + 1, $plainText, $ansiColors);
115 } elseif (is_object($value)) {
116 $dump = self::renderObject($value, $level + 1, $plainText, $ansiColors);
130 static protected function renderArray($array, $level, $plainText = FALSE, $ansiColors = FALSE) {
132 $count = count($array);
135 $header = self::ansiEscapeWrap(
'array',
'36', $ansiColors);
137 $header =
'<span class="debug-type">array</span>';
139 $header .= $count > 0 ?
'(' . $count .
' item' . ($count > 1 ?
's' :
'') .
')' :
'(empty)';
140 if ($level >= self::$maxDepth) {
142 $header .=
' ' . self::ansiEscapeWrap(
'max depth',
'47;30', $ansiColors);
144 $header .=
'<span class="debug-filtered">max depth</span>';
147 $content = self::renderCollection($array, $level, $plainText, $ansiColors);
149 $header = ($level > 1 && $count > 0 ?
'<input type="checkbox" /><span class="debug-header" >' :
'<span>') . $header .
'</span >';
152 if ($level > 1 && $count > 0 && !$plainText) {
153 $dump =
'<span class="debug-tree">' . $header .
'<span class="debug-content">' . $content .
'</span></span>';
155 $dump = $header . $content;
169 static protected function renderObject($object, $level, $plainText = FALSE, $ansiColors = FALSE) {
170 if ($object instanceof \
TYPO3\CMS\Extbase\Persistence\Generic\LazyLoadingProxy) {
171 $object = $object->_loadRealInstance();
173 return gettype($object);
176 $header = self::renderHeader($object, $level, $plainText, $ansiColors);
177 if ($level < self::$maxDepth && !self::isBlacklisted($object) && !(self::isAlreadyRendered($object) && $plainText !== TRUE)) {
178 $content = self::renderContent($object, $level, $plainText, $ansiColors);
183 return $header . $content;
185 return '<span class="debug-tree">' . $header .
'<span class="debug-content">' . $content .
'</span></span>';
197 if ($value instanceof \ReflectionProperty) {
198 $result = (strpos(implode(
'|', self::$blacklistedPropertyNames), $value->getName()) > 0);
199 } elseif (is_object($value)) {
200 $result = (strpos(implode(
'|', self::$blacklistedClassNames), get_class($value)) > 0);
212 return self::$renderedObjects->contains($object);
224 static protected function renderHeader($object, $level, $plainText, $ansiColors) {
226 $persistenceType =
'';
227 $className = get_class($object);
228 $classReflection = new \ReflectionClass($className);
230 $dump .= self::ansiEscapeWrap($className,
'36', $ansiColors);
232 $dump .=
'<span class="debug-type">' . $className .
'</span>';
234 if (!$object instanceof \Closure) {
235 if ($object instanceof \
TYPO3\CMS\Core\SingletonInterface) {
236 $scope =
'singleton';
238 $scope =
'prototype';
241 $dump .=
' ' . self::ansiEscapeWrap($scope,
'44;37', $ansiColors);
243 $dump .= $scope ?
'<span class="debug-scope">' . $scope .
'</span>' :
'';
245 if ($object instanceof \
TYPO3\CMS\Extbase\DomainObject\AbstractDomainObject) {
246 if ($object->_isDirty()) {
247 $persistenceType =
'modified';
248 } elseif ($object->_isNew()) {
249 $persistenceType =
'transient';
251 $persistenceType =
'persistent';
254 if ($object instanceof \
TYPO3\CMS\Extbase\Persistence\ObjectStorage && $object->_isDirty()) {
255 $persistenceType =
'modified';
257 if ($object instanceof \
TYPO3\CMS\Extbase\DomainObject\AbstractEntity) {
258 $domainObjectType =
'entity';
259 } elseif ($object instanceof \
TYPO3\CMS\Extbase\DomainObject\AbstractValueObject) {
260 $domainObjectType =
'valueobject';
262 $domainObjectType =
'object';
265 $dump .=
' ' . self::ansiEscapeWrap(($persistenceType .
' ' . $domainObjectType),
'42;30', $ansiColors);
267 $dump .=
'<span class="debug-ptype">' . ($persistenceType ? $persistenceType .
' ' :
'') . $domainObjectType .
'</span>';
270 if (strpos(implode(
'|', self::$blacklistedClassNames), get_class($object)) > 0) {
272 $dump .=
' ' . self::ansiEscapeWrap(
'filtered',
'47;30', $ansiColors);
274 $dump .=
'<span class="debug-filtered">filtered</span>';
276 } elseif (self::$renderedObjects->contains($object) && !$plainText) {
277 $dump =
'<a href="javascript:;" onclick="document.location.hash=\'#' . spl_object_hash($object) .
'\';
" class="debug-seeabove
">' . $dump . '<span class="debug-filtered
">see above</span></a>'; 278 } elseif ($level >= self::$maxDepth && !$object instanceof \DateTime) { 280 $dump .= ' ' . self::ansiEscapeWrap('max depth', '47;30', $ansiColors); 282 $dump .= '<span class="debug-filtered
">max depth</span>'; 284 } elseif ($level > 1 && !$object instanceof \DateTime && !$plainText) { 285 if (($object instanceof \Countable && count($object) === 0) || (count($classReflection->getProperties()) === 0)) { 286 $dump = '<span>' . $dump . '</span>'; 288 $dump = '<input type="checkbox
" id="' . spl_object_hash($object) . '" /><span class="debug-header
">' . $dump . '</span>'; 291 if ($object instanceof \Countable) { 292 $dump .= count($object) > 0 ? ' (' . count($object) . ' items)' : ' (empty)'; 294 if ($object instanceof \DateTime) { 295 $dump .= ' (' . $object->format(\DateTime::RFC3339) . ', ' . $object->getTimestamp() . ')'; 297 if ($object instanceof \TYPO3\CMS\Extbase\DomainObject\DomainObjectInterface && !$object->_isNew()) { 298 $dump .= ' (uid=' . $object->getUid() . ', pid=' . $object->getPid() . ')'; 310 static protected function renderContent($object, $level, $plainText, $ansiColors) { 312 if ($object instanceof \TYPO3\CMS\Extbase\Persistence\ObjectStorage || $object instanceof \Iterator || $object instanceof \ArrayObject) { 313 $dump .= self::renderCollection($object, $level, $plainText, $ansiColors); 315 self::$renderedObjects->attach($object); 317 $dump .= '<a name="' . spl_object_hash($object) . '" id="' . spl_object_hash($object) . '"></a>'; 319 if (get_class($object) === 'stdClass') { 320 $objReflection = new \ReflectionObject($object); 321 $properties = $objReflection->getProperties(); 323 $classReflection = new \ReflectionClass(get_class($object)); 324 $properties = $classReflection->getProperties(); 326 foreach ($properties as $property) { 327 if (self::isBlacklisted($property)) { 330 $dump .= PHP_EOL . str_repeat(self::PLAINTEXT_INDENT, $level); 332 $dump .= self::ansiEscapeWrap($property->getName(), '37', $ansiColors); 334 $dump .= '<span class="extbase-
debug-
property">' . 335 htmlspecialchars($property->getName()) . '</span>'; 338 $property->setAccessible(TRUE); 339 $dump .= self::renderDump($property->getValue($object), $level, $plainText, $ansiColors); 340 if ($object instanceof \TYPO3\CMS\Extbase\DomainObject\AbstractDomainObject && !$object->_isNew() && $object->_isDirty($property->getName())) { 342 $dump .= ' ' . self::ansiEscapeWrap('modified', '43;30', $ansiColors); 344 $dump .= '<span class="debug-dirty
">modified</span>'; 359 static protected function renderCollection($collection, $level, $plainText, $ansiColors) { 361 foreach ($collection as $key => $value) { 362 $dump .= PHP_EOL . str_repeat(self::PLAINTEXT_INDENT, $level) . ($plainText ? '' : '<span class="debug-
property">') . self::ansiEscapeWrap($key, '37', $ansiColors) . ($plainText ? '' : '</span>') . ' => '; 363 $dump .= self::renderDump($value, $level, $plainText, $ansiColors); 365 if ($collection instanceof \Iterator) { 366 $collection->rewind(); 379 static protected function ansiEscapeWrap($string, $ansiColors, $enable = TRUE) { 381 return '[' . $ansiColors . 'm' . $string . '[0m'; 401 static public function var_dump($variable, $title = NULL, $maxDepth = 8, $plainText = FALSE, $ansiColors = TRUE, $return = FALSE, $blacklistedClassNames = NULL, $blacklistedPropertyNames = NULL) { 402 self::$maxDepth = $maxDepth; 403 if ($title === NULL) { 404 $title = 'Extbase Variable Dump'; 406 $ansiColors = $plainText && $ansiColors; 407 if ($ansiColors === TRUE) { 408 $title = '[1m' . $title . '[0m'; 410 if (is_array($blacklistedClassNames)) { 411 self::$blacklistedClassNames = $blacklistedClassNames; 413 if (is_array($blacklistedPropertyNames)) { 414 self::$blacklistedPropertyNames = $blacklistedPropertyNames; 417 if (!$plainText && self::$stylesheetEchoed === FALSE) { 419 <style type=\'text/css\'> 420 .debug-tree{position:relative;} 421 .debug-tree input{position:absolute;top:0;left:0;cursor:pointer;opacity:0;z-index:2;} 422 .debug-tree input ~ .debug-content{display:none;} 423 .debug-tree .debug-header:before{content:"+
";padding:0 2px 0 2px;margin:0 3px 0 3px;font-size:1em;font-weight:bold;color:#004fb0;border:1px #004fb0 solid;} 424 .debug-tree input:checked ~ .debug-content{display:inline;} 425 .debug-tree input:checked ~ .debug-header:before{content:"-
";} 426 .Extbase-Utility-Debugger-VarDump{display:block;text-align:left;background:#b9b9b9;border:10px solid #b9b9b9;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;-moz-box-shadow:0 0 20px #333;-webkit-box-shadow:0 0 20px #333;box-shadow:0 0 20px #333;z-index:999;color:#000;margin:20px 0 0;} 427 .Extbase-Utility-Debugger-VarDump-Floating{position:relative;width:96%;margin:40px auto;} 428 .Extbase-Utility-Debugger-VarDump-Top{background:#eee;font:normal bold 12px \'Lucida Grande\',sans-serif;padding:5px;} 429 .Extbase-Utility-Debugger-VarDump-Center{background:#b9b9b9 url(data:image/gif;base64,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) 0 18px repeat;font:normal normal 11px/18px Monospaced,\'Lucida Console\',monospace;padding:18px 10px;} 430 .Extbase-Utility-Debugger-VarDump-Center pre{background-color:transparent;margin:0;padding:0;} 431 .Extbase-Utility-Debugger-VarDump-Center,.Extbase-Utility-Debugger-VarDump-Center pre,.Extbase-Utility-Debugger-VarDump-Center p,.Extbase-Utility-Debugger-VarDump-Center a,.Extbase-Utility-Debugger-VarDump-Center strong,.Extbase-Utility-Debugger-VarDump-Center .debug-string{font:normal normal 11px/18px Monospaced,\'Lucida Console\',monospace;} 432 .Extbase-Utility-Debugger-VarDump-Center .debug-string{color:#000;white-space:normal;} 433 .Extbase-Utility-Debugger-VarDump-Center .debug-type{color:#004fb0;padding-right:4px;} 434 .Extbase-Utility-Debugger-VarDump-Center .debug-unregistered{background-color:#dce1e8;} 435 .Extbase-Utility-Debugger-VarDump-Center .debug-scope,.Extbase-Utility-Debugger-VarDump-Center .debug-ptype,.Extbase-Utility-Debugger-VarDump-Center .debug-proxy,.Extbase-Utility-Debugger-VarDump-Center .debug-filtered{color:#FFF;font-size:10px;line-height:16px;padding:1px 4px;margin-right:2px;} 436 .Extbase-Utility-Debugger-VarDump-Center .debug-scope{background-color:#3e7fe1;} 437 .Extbase-Utility-Debugger-VarDump-Center .debug-ptype{background-color:#6FBC16;} 438 .Extbase-Utility-Debugger-VarDump-Center .debug-dirty{background-color:#FFFF00;} 439 .Extbase-Utility-Debugger-VarDump-Center .debug-filtered{background-color:#8c8c8c;} 440 .Extbase-Utility-Debugger-VarDump-Center .debug-seeabove{text-decoration:none;font-style:italic;font-weight:400;} 441 .Extbase-Utility-Debugger-VarDump-Center .debug-property{color:#555;line-height:16px;padding:1px 2px;} 443 self::$stylesheetEchoed = TRUE; 446 $output = $title . PHP_EOL . self::renderDump($variable, 0, TRUE, $ansiColors) . PHP_EOL . PHP_EOL; 449 <div class="Extbase-Utility-Debugger-VarDump
' . ($return ? 'Extbase-Utility-Debugger-VarDump-Inline
' : 'Extbase-Utility-Debugger-VarDump-Floating
') . '"> 450 <div class="Extbase-Utility-Debugger-VarDump-Top
">' . htmlspecialchars($title) . '</div> 451 <div class="Extbase-Utility-Debugger-VarDump-Center
"> 452 <pre dir="ltr
">' . self::renderDump($variable, 0, FALSE, FALSE) . '</pre> 457 if ($return === TRUE) {
static renderHeader($object, $level, $plainText, $ansiColors)
static renderArray($array, $level, $plainText=FALSE, $ansiColors=FALSE)
static isAlreadyRendered($object)
static renderObject($object, $level, $plainText=FALSE, $ansiColors=FALSE)
if($list_of_literals) if(!empty($literals)) if(!empty($literals)) $result
Analyse literals to prepend the N char to them if their contents aren't numeric.
static isBlacklisted($value)
static renderDump($value, $level, $plainText, $ansiColors)
debug($variable='', $name=' *variable *', $line=' *line *', $file=' *file *', $recursiveDepth=3, $debugLevel=E_DEBUG)
static $blacklistedClassNames
static $blacklistedPropertyNames