%PDF- %PDF-
| Direktori : /www/loslex/test/vendor/maximebf/debugbar/src/DebugBar/DataCollector/ |
| Current File : /www/loslex/test/vendor/maximebf/debugbar/src/DebugBar/DataCollector/MessagesCollector.php |
<?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\DataCollector;
use DebugBar\DataFormatter\HasXdebugLinks;
use Psr\Log\AbstractLogger;
use DebugBar\DataFormatter\HasDataFormatter;
/**
* Provides a way to log messages
*/
class MessagesCollector extends AbstractLogger implements DataCollectorInterface, MessagesAggregateInterface, Renderable, AssetProvider
{
use HasDataFormatter, HasXdebugLinks;
protected $name;
protected $messages = array();
protected $aggregates = array();
/** @var bool */
protected $collectFile = false;
/**
* @param string $name
*/
public function __construct($name = 'messages')
{
$this->name = $name;
}
/** @return void */
public function collectFileTrace($enabled = true)
{
$this->collectFile = $enabled;
}
/**
* @param string|null $messageHtml
* @param mixed $message
*
* @return string|null
*/
protected function customizeMessageHtml($messageHtml, $message)
{
$pos = strpos((string) $messageHtml, 'sf-dump-expanded');
if ($pos !== false) {
$messageHtml = substr_replace($messageHtml, 'sf-dump-compact', $pos, 16);
}
return $messageHtml;
}
/**
* Adds a message
*
* A message can be anything from an object to a string
*
* @param mixed $message
* @param string $label
*/
public function addMessage($message, $label = 'info', $isString = true)
{
$messageText = $message;
$messageHtml = null;
if (!is_string($message)) {
// Send both text and HTML representations; the text version is used for searches
$messageText = $this->getDataFormatter()->formatVar($message);
if ($this->isHtmlVarDumperUsed()) {
$messageHtml = $this->getVarDumper()->renderVar($message);
}
$isString = false;
}
$stackItem = [];
if ($this->collectFile) {
$stacktrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 5);
$stackItem = $stacktrace[0];
foreach ($stacktrace as $trace) {
if (!isset($trace['file']) || strpos($trace['file'], '/vendor/') !== false) {
continue;
}
$stackItem = $trace;
break;
}
}
$this->messages[] = array(
'message' => $messageText,
'message_html' => $this->customizeMessageHtml($messageHtml, $message),
'is_string' => $isString,
'label' => $label,
'time' => microtime(true),
'xdebug_link' => $stackItem ? $this->getXdebugLink($stackItem['file'], $stackItem['line'] ?? null) : null,
);
}
/**
* Aggregates messages from other collectors
*
* @param MessagesAggregateInterface $messages
*/
public function aggregate(MessagesAggregateInterface $messages)
{
if ($this->collectFile && method_exists($messages, 'collectFileTrace')) {
$messages->collectFileTrace();
}
$this->aggregates[] = $messages;
}
/**
* @return array
*/
public function getMessages()
{
$messages = $this->messages;
foreach ($this->aggregates as $collector) {
$msgs = array_map(function ($m) use ($collector) {
$m['collector'] = $collector->getName();
return $m;
}, $collector->getMessages());
$messages = array_merge($messages, $msgs);
}
// sort messages by their timestamp
usort($messages, function ($a, $b) {
if ($a['time'] === $b['time']) {
return 0;
}
return $a['time'] < $b['time'] ? -1 : 1;
});
return $messages;
}
/**
* @param $level
* @param $message
* @param array $context
*/
public function log($level, $message, array $context = array()): void
{
// For string messages, interpolate the context following PSR-3
if (is_string($message)) {
$message = $this->interpolate($message, $context);
}
$this->addMessage($message, $level);
}
/**
* Interpolates context values into the message placeholders.
*
* @param string $message
* @param array $context
* @return string
*/
function interpolate($message, array $context = array())
{
// build a replacement array with braces around the context keys
$replace = array();
foreach ($context as $key => $val) {
$placeholder = '{' . $key . '}';
if (strpos($message, $placeholder) === false) {
continue;
}
// check that the value can be cast to string
if (null === $val || is_scalar($val) || (is_object($val) && method_exists($val, "__toString"))) {
$replace[$placeholder] = $val;
} elseif ($val instanceof \DateTimeInterface) {
$replace[$placeholder] = $val->format("Y-m-d\TH:i:s.uP");
} elseif ($val instanceof \UnitEnum) {
$replace[$placeholder] = $val instanceof \BackedEnum ? $val->value : $val->name;
} elseif (is_object($val)) {
$replace[$placeholder] = '[object ' . $this->getDataFormatter()->formatClassName($val) . ']';
} elseif (is_array($val)) {
$json = @json_encode($val);
$replace[$placeholder] = false === $json ? 'null' : 'array' . $json;
} else {
$replace[$placeholder] = '['.gettype($val).']';
}
}
// interpolate replacement values into the message and return
return strtr($message, $replace);
}
/**
* Deletes all messages
*/
public function clear()
{
$this->messages = array();
}
/**
* @return array
*/
public function collect()
{
$messages = $this->getMessages();
return array(
'count' => count($messages),
'messages' => $messages
);
}
/**
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* @return array
*/
public function getAssets() {
return $this->isHtmlVarDumperUsed() ? $this->getVarDumper()->getAssets() : array();
}
/**
* @return array
*/
public function getWidgets()
{
$name = $this->getName();
return array(
"$name" => array(
'icon' => 'list-alt',
"widget" => "PhpDebugBar.Widgets.MessagesWidget",
"map" => "$name.messages",
"default" => "[]"
),
"$name:badge" => array(
"map" => "$name.count",
"default" => "null"
)
);
}
}