{"record":{"id":"5fe081e92dcd430e","repo":"symfony/routing","slug":"default-query-must-be-an-array-of-query-parameters-for-route","errorCode":null,"errorMessage":"Default \"_query\" must be an array of query parameters for route \"%s\".","messagePattern":"Default \"_query\" must be an array of query parameters for route \"(.+?)\"\\.","errorType":"validation","errorClass":"InvalidParameterException","httpStatus":null,"severity":"error","filePath":"Generator/UrlGenerator.php","lineNumber":149,"sourceCode":"            } elseif (!isset($parameters['_locale'])) {\n                $parameters['_locale'] = $defaults['_locale'];\n            }\n        }\n\n        return $this->doGenerate($variables, $defaults, $route->getRequirements(), $compiledRoute->getTokens(), $parameters, $name, $referenceType, $compiledRoute->getHostTokens(), $route->getSchemes());\n    }\n\n    /**\n     * @throws MissingMandatoryParametersException When some parameters are missing that are mandatory for the route\n     * @throws InvalidParameterException           When a parameter value for a placeholder is not correct because\n     *                                             it does not match the requirement\n     */\n    protected function doGenerate(array $variables, array $defaults, array $requirements, array $tokens, array $parameters, string $name, int $referenceType, array $hostTokens, array $requiredSchemes = []): string\n    {\n        $defaultQuery = $defaults['_query'] ?? [];\n\n        if (!\\is_array($defaultQuery)) {\n            throw new InvalidParameterException(\\sprintf('Default \"_query\" must be an array of query parameters for route \"%s\".', $name));\n        }\n\n        $queryParameters = [];\n\n        if (isset($parameters['_query'])) {\n            if (\\is_array($parameters['_query'])) {\n                $queryParameters = $parameters['_query'];\n                unset($parameters['_query']);\n            } else {\n                throw new InvalidParameterException('Parameter \"_query\" must be an array of query parameters.');\n            }\n        }\n\n        $variables = array_flip($variables);\n        $mergedParams = array_replace($defaults, $this->context->getParameters(), $parameters);\n\n        // all params must be given\n        if ($diff = array_diff_key($variables, $mergedParams)) {","sourceCodeStart":131,"sourceCodeEnd":167,"githubUrl":"https://github.com/symfony/routing/blob/83fa223250b50f4f018c011e101c330e65ac63cc/Generator/UrlGenerator.php#L131-L167","documentation":"A route may define a default '_query' holding extra query parameters appended to generated URLs. This error means $defaults['_query'] exists but is not an array, so it cannot be merged as query parameters.","triggerScenarios":"Route definition sets defaults: { _query: 'something' } (or a scalar/null) and doGenerate() runs during generate().","commonSituations":"Misconfigured route defaults in YAML/PHP config (quoted string instead of mapping); controller attribute passing a scalar _query default.","solutions":["Change the _query default to a mapping: defaults: { _query: { foo: 'bar' } }.","Remove _query from defaults if not needed.","Check YAML indentation so _query is parsed as a map, not a string."],"exampleFix":"// before (routes.yaml)\ndefaults: { _controller: 'App\\Controller::index', _query: 'foo=bar' }\n// after\ndefaults: { _controller: 'App\\Controller::index', _query: { foo: 'bar' } }","handlingStrategy":"validation","validationCode":"if (isset($defaults['_query']) && !is_array($defaults['_query'])) {\n    throw new LogicException('Route default \"_query\" must be an array.');\n}","typeGuard":"function hasValidDefaultQuery(array $defaults): bool { return !isset($defaults['_query']) || is_array($defaults['_query']); }","tryCatchPattern":"use Symfony\\Component\\Routing\\Exception\\InvalidParameterException;\ntry { $url = $generator->generate($name); } catch (InvalidParameterException $e) { $url = '/'; }","preventionTips":["Define _query defaults as YAML mappings, not strings","Quote-check YAML so _query isn't parsed as text","Add config linting (php bin/console lint:yaml)"],"tags":["php","symfony-routing","config"],"backgroundTag":"invalid-config-value","analyzedSha":"83fa223250b50f4f018c011e101c330e65ac63cc","analyzedAt":"2026-09-14T03:19:46.280Z","contentChangedAt":"2026-09-14T03:19:46.280Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}