flarum/framework · error · BadRequestException

include must be a string

Error message

include must be a string

What it means

Guard in RequestUtil::extractInclude: the 'include' query parameter (comma-separated relationship paths for eager loading) must be a plain string. If a client sends ?include[]=foo style array params, the value cannot be split into paths and a 400 BadRequestException is thrown.

Solutions

  1. Send include as one string: ?include=user,posts.user
  2. Avoid array-style include[] parameters
  3. Fix the client's query builder so it joins include paths with commas
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at framework/core/src/Http/RequestUtil.php:208 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/e17dfc7ea1a5cb38. Report an issue: GitHub.

Appendix: source

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

        if ($request->getQueryParams()['page']['number'] ?? false) {
            return self::extractOffsetFromNumber($request, $limit);
        }

        $offset = (int) ($request->getQueryParams()['page']['offset'] ?? 0);

        if ($offset < 0) {
            throw new BadRequestException('page[offset] must be at least 0');
        }

        return $offset;
    }

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

        if (! is_string($include)) {
            throw new BadRequestException('include must be a string');
        }

        $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)) {

View on GitHub (pinned to 4b939f6853)