laravel/framework · error · LogicException

Failed to find resource class for model [%s].

Error message

Failed to find resource class for model [%s].

What it means

Thrown by guessResourceCollection() when no resource class can be resolved for the model. The guesser checks UseResourceCollection/UseResource attributes, then calls guessResourceName() and looks for a matching '*Collection' class and then the resource class itself. If none exist in the autoloader, LogicException is thrown naming the model.

Source

Thrown at src/Illuminate/Collections/Traits/TransformsToResourceCollection.php:85

        }

        $resourceClasses = $className::guessResourceName();

        foreach ($resourceClasses as $resourceClass) {
            $resourceCollection = $resourceClass.'Collection';

            if (is_string($resourceCollection) && class_exists($resourceCollection)) {
                return new $resourceCollection($this);
            }
        }

        foreach ($resourceClasses as $resourceClass) {
            if (is_string($resourceClass) && class_exists($resourceClass)) {
                return $resourceClass::collection($this);
            }
        }

        throw new LogicException(sprintf('Failed to find resource class for model [%s].', $className));
    }

    /**
     * Get the resource class from the class attribute.
     *
     * @param  class-string<\Illuminate\Http\Resources\Json\JsonResource>  $class
     * @return class-string<*>|null
     */
    protected function resolveResourceFromAttribute(string $class): ?string
    {
        if (! class_exists($class)) {
            return null;
        }

        $attributes = (new ReflectionClass($class))->getAttributes(UseResource::class);

        return $attributes !== []
            ? $attributes[0]->newInstance()->class

View on GitHub (pinned to bd6b5437e6)

Solutions

  1. Create the referenced resource (and/or *Collection) class at the expected namespace.
  2. Align guessResourceName()'s return value with the actual resource class FQN.
  3. Pass an explicit resource class to toResourceCollection() to skip guessing.

Example fix

// before
// UserResource does not exist; guesser fails
return $users->toResourceCollection();

// after
return $users->toResourceCollection(App\Http\Resources\UserResource::class);
Defensive patterns

Strategy: try-catch

Validate before calling

$guessed = get_class($collection->first())::guessResourceName();
foreach ($guessed as $cls) {
    if (class_exists($cls) || class_exists($cls.'Collection')) {
        return $collection->toResourceCollection();
    }
}
return $collection->toResourceCollection(DefaultResource::class);

Type guard

function resourceResolvable(string $modelClass): bool {
    if (! method_exists($modelClass, 'guessResourceName')) return false;
    foreach ($modelClass::guessResourceName() as $r) {
        if (class_exists($r) || class_exists($r.'Collection')) return true;
    }
    return false;
}

Try / catch

try {
    $resource = $collection->toResourceCollection();
} catch (\LogicException $e) {
    $resource = $collection->toResourceCollection(DefaultResource::class);
}

Prevention

When it happens

Trigger: Calling toResourceCollection() on a model whose guessResourceName() returns a class that does not exist, or no matching *Collection / resource class is defined. Forgetting to create UserResource / UserResourceCollection.

Common situations: Model uses TransformsToResource and guessResourceName returns 'App\Http\Resources\UserResource', but the file was never generated. Namespace mismatch between model and resource convention.

Related errors


AI-assisted analysis of laravel/framework@bd6b5437e6 (2026-08-06). Data as JSON: /data/errors/4f645619f3074556.json. Report an issue: GitHub.