Skip to content

Array arguments string conversion bug #67

@kirkmadera

Description

@kirkmadera

We noticed an "Array to string conversion" bug with some of our queries. Not sure if we made the right fix, but we ended up overriding a few classes in order to fix.

GraphQl\Query::constructArguments:
image

GraphQL\Util\StringLiteralFormatter:

Added these methods:

/**
 * @param array $array
 *
 * @return string
 */
public static function formatArrayForGQLQuery(array $array): string
{
    $arrString = '{';
    $first = true;
    foreach ($array as $name => $element) {
        if ($first) {
            $first = false;
        } else {
            $arrString .= ', ';
        }
        if (is_array($element)) {
            $arrString .= $name . ':';
            if (array_keys($element) !== range(0, count($element) - 1)) {
                $arrString .= static::formatAssociativeArray($element);
            } else {
                $arrString .= static::formatSequentialArray($element);
            }
        } else {
            $arrString .= $name . ':' . \GraphQL\Util\StringLiteralFormatter::formatValueForRHS($element);
        }
    }
    $arrString .= '}';

    return $arrString;
}

/**
 * @param $array
 * @return string
 */
public static function formatSequentialArray($array): string
{
    $arrString = '[';
    foreach ($array as $value) {
        $arrString .= static::formatAssociativeArray($value);
    }
    $arrString .= ']';
    return $arrString;
}

/**
 * @param $array
 * @return string
 */
public static function formatAssociativeArray($array): string
{
    $arrString = '{';
    $first = true;
    foreach ($array as $key => $val) {
        if ($first) {
            $first = false;
        } else {
            $arrString .= ', ';
        }
        if (is_array($val)) {
            $arrString .= $key . ':';
            if (array_keys($val) !== range(0, count($val) - 1)) {
                $arrString .= static::formatAssociativeArray($val);
            } else {
                $arrString .= static::formatSequentialArray($val);
            }
        } else {
            $arrString .= $key . ':' . \GraphQL\Util\StringLiteralFormatter::formatValueForRHS($val);
        }
    }
    $arrString .= '}';
    return $arrString;
}

Not sure if this is the right approach or if we are using this incorrectly, but this did get us past the issues we were running into.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions