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()->classView on GitHub (pinned to bd6b5437e6)
Solutions
- Create the referenced resource (and/or *Collection) class at the expected namespace.
- Align guessResourceName()'s return value with the actual resource class FQN.
- 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
- Create resource classes (and matching *Collection) at the convention guessResourceName() returns.
- Pass an explicit resource class to avoid relying on guess resolution.
- Cover resource guessing in a smoke test so missing classes fail CI.
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
- Resource collection guesser expects the collection to contai
- Expected class %s to implement guessResourceName method. Mak
- Array value for key [%s] must be an array, %s found.
- Array value for key [%s] must be a boolean, %s found.
- Array value for key [%s] must be a float, %s found.
AI-assisted analysis of laravel/framework@bd6b5437e6 (2026-08-06).
Data as JSON: /data/errors/4f645619f3074556.json.
Report an issue: GitHub.