flarum/framework · error · BadRequestException

filter must be an array

Error message

filter must be an array

What it means

Guard in RequestUtil::extractFilter: the 'filter' query parameter must be an object/array of filter criteria (e.g. ?filter[author]=...). If a client sends filter as a scalar string, it cannot be mapped to filterable query keys, so a 400 BadRequestException is thrown.

Solutions

  1. Send filters in object form: ?filter[q]=term or ?filter[author]=1
  2. Do not send ?filter=scalarValue
  3. Fix the client query serialization so filter is always a keyed object
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at framework/core/src/Http/RequestUtil.php:227 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of flarum/framework@4b939f6853 (2026-09-15). Data as JSON: /api/errors/2c66b9ccda535c4c. Report an issue: GitHub.

Appendix: source

Thrown at framework/core/src/Http/RequestUtil.php:227

        }

        $includes = array_filter(explode(',', $include));

        $invalid = array_diff($includes, $available);

        if (count($invalid)) {
            throw new BadRequestException('Invalid includes ['.implode(',', $invalid).']');
        }

        return $includes;
    }

    public static function extractFilter(Request $request): array
    {
        $filter = $request->getQueryParams()['filter'] ?? [];

        if (! is_array($filter)) {
            throw new BadRequestException('filter must be an array');
        }

        return $filter;
    }

    public static function extractFields(Request $request, ?array $available = null): array
    {
        $fields = $request->getQueryParams()['fields'] ?? [];

        if (! is_array($fields)) {
            throw new BadRequestException('fields must be an array');
        }

        if ($available !== null) {
            $invalid = array_diff(array_keys($fields), $available);

            if (count($invalid)) {
                throw new BadRequestException('Invalid fields ['.implode(',', $invalid).']');

View on GitHub (pinned to 4b939f6853)