mirror of
https://github.com/retailcrm/graphql-php.git
synced 2024-11-25 14:26:08 +03:00
Various tools for better error reporting / formatting
This commit is contained in:
parent
2675b65095
commit
927997a705
@ -2,7 +2,15 @@
|
|||||||
namespace GraphQL\Error;
|
namespace GraphQL\Error;
|
||||||
|
|
||||||
use GraphQL\Language\SourceLocation;
|
use GraphQL\Language\SourceLocation;
|
||||||
|
use GraphQL\Type\Definition\Type;
|
||||||
|
use GraphQL\Type\Definition\WrappingType;
|
||||||
|
use GraphQL\Utils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class FormattedError
|
||||||
|
* @todo move this class to Utils/ErrorUtils
|
||||||
|
* @package GraphQL\Error
|
||||||
|
*/
|
||||||
class FormattedError
|
class FormattedError
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
@ -23,4 +31,101 @@ class FormattedError
|
|||||||
|
|
||||||
return $formatted;
|
return $formatted;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param \ErrorException $e
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public static function createFromPHPError(\ErrorException $e)
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'message' => $e->getMessage(),
|
||||||
|
'severity' => $e->getSeverity(),
|
||||||
|
'trace' => self::toSafeTrace($e->getTrace())
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param \Exception $e
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public static function createFromException(\Exception $e)
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'message' => $e->getMessage(),
|
||||||
|
'trace' => self::toSafeTrace($e->getTrace())
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts error trace to serializable array
|
||||||
|
*
|
||||||
|
* @param array $trace
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
private static function toSafeTrace(array $trace)
|
||||||
|
{
|
||||||
|
// Remove invariant entries as they don't provide much value:
|
||||||
|
if (
|
||||||
|
isset($trace[0]['function']) && isset($trace[0]['class']) &&
|
||||||
|
('GraphQL\Utils::invariant' === $trace[0]['class'].'::'.$trace[0]['function'])) {
|
||||||
|
array_shift($trace);
|
||||||
|
}
|
||||||
|
|
||||||
|
return array_map(function($err) {
|
||||||
|
$safeErr = array_intersect_key($err, ['file' => true, 'line' => true]);
|
||||||
|
|
||||||
|
if (isset($err['function'])) {
|
||||||
|
$func = $err['function'];
|
||||||
|
$args = !empty($err['args']) ? array_map([__CLASS__, 'printVar'], $err['args']) : [];
|
||||||
|
$funcStr = $func . '(' . implode(", ", $args) . ')';
|
||||||
|
|
||||||
|
if (isset($err['class'])) {
|
||||||
|
$safeErr['call'] = $err['class'] . '::' . $funcStr;
|
||||||
|
} else {
|
||||||
|
$safeErr['function'] = $funcStr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $safeErr;
|
||||||
|
}, $trace);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $var
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function printVar($var)
|
||||||
|
{
|
||||||
|
if ($var instanceof Type) {
|
||||||
|
// FIXME: Replace with schema printer call
|
||||||
|
if ($var instanceof WrappingType) {
|
||||||
|
$var = $var->getWrappedType(true);
|
||||||
|
}
|
||||||
|
return 'GraphQLType: ' . $var->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_object($var)) {
|
||||||
|
return 'instance of ' . get_class($var) . ($var instanceof \Countable ? '(' . count($var) . ')' : '');
|
||||||
|
}
|
||||||
|
if (is_array($var)) {
|
||||||
|
return 'array(' . count($var) . ')';
|
||||||
|
}
|
||||||
|
if ('' === $var) {
|
||||||
|
return '(empty string)';
|
||||||
|
}
|
||||||
|
if (is_string($var)) {
|
||||||
|
return "'" . addcslashes($var, "'") . "'";
|
||||||
|
}
|
||||||
|
if (is_bool($var)) {
|
||||||
|
return $var ? 'true' : 'false';
|
||||||
|
}
|
||||||
|
if (is_scalar($var)) {
|
||||||
|
return $var;
|
||||||
|
}
|
||||||
|
if (null === $var) {
|
||||||
|
return 'null';
|
||||||
|
}
|
||||||
|
return gettype($var);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
15
src/Error/InvariantViolation.php
Normal file
15
src/Error/InvariantViolation.php
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<?php
|
||||||
|
namespace GraphQL\Error;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class InvariantVoilation
|
||||||
|
*
|
||||||
|
* Note:
|
||||||
|
* This exception should not inherit base Error exception as it is raised when there is an error somewhere in
|
||||||
|
* user-land code
|
||||||
|
*
|
||||||
|
* @package GraphQL\Error
|
||||||
|
*/
|
||||||
|
class InvariantViolation extends \LogicException
|
||||||
|
{
|
||||||
|
}
|
@ -1,6 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace GraphQL\Type\Definition;
|
namespace GraphQL\Type\Definition;
|
||||||
|
|
||||||
|
use GraphQL\Error\InvariantViolation;
|
||||||
use GraphQL\Utils;
|
use GraphQL\Utils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -184,7 +185,7 @@ class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
throw new \Exception('Error in "'.$typeName.'" type definition: ' . "unexpected definition: " . print_r($def, true));
|
throw new InvariantViolation('Error in "'.$typeName.'" type definition: ' . "unexpected definition: " . print_r($def, true));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Utils::invariant(is_int($def), 'Error in "'.$typeName.'" type definition: ' . "Definition for '$pathStr' is expected to be single integer value");
|
Utils::invariant(is_int($def), 'Error in "'.$typeName.'" type definition: ' . "Definition for '$pathStr' is expected to be single integer value");
|
||||||
@ -250,7 +251,7 @@ class Config
|
|||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
throw new \Exception("Unexpected validation rule: " . $def);
|
throw new InvariantViolation("Unexpected validation rule: " . $def);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace GraphQL;
|
namespace GraphQL;
|
||||||
|
|
||||||
|
use GraphQL\Error\InvariantViolation;
|
||||||
use GraphQL\Type\Definition\Type;
|
use GraphQL\Type\Definition\Type;
|
||||||
use GraphQL\Type\Definition\WrappingType;
|
use GraphQL\Type\Definition\WrappingType;
|
||||||
use GraphQL\Utils\SchemaUtils;
|
use GraphQL\Utils\SchemaUtils;
|
||||||
@ -201,7 +202,7 @@ class Utils
|
|||||||
array_shift($args);
|
array_shift($args);
|
||||||
$message = call_user_func_array('sprintf', $args);
|
$message = call_user_func_array('sprintf', $args);
|
||||||
}
|
}
|
||||||
throw new \Exception($message);
|
throw new InvariantViolation($message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user